Этот код использует команду «где» в Windows и команду «which» в других системах, чтобы проверить, знает ли система о желаемой программе в PATH. Если найдено, функция возвращает java.nio.file.Path программе, а null - в противном случае.
Я тестировал его с помощью Java 8 на Windows 7 и Linux Mint 17.3.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.logging.Logger;
public class SimulationUtils
{
private final static Logger LOGGER = Logger.getLogger(SimulationUtils.class.getName());
public static Path lookForProgramInPath(String desiredProgram) {
ProcessBuilder pb = new ProcessBuilder(isWindows() ? "where" : "which", desiredProgram);
Path foundProgram = null;
try {
Process proc = pb.start();
int errCode = proc.waitFor();
if (errCode == 0) {
try (BufferedReader reader = new BufferedReader(new InputStreamReader(proc.getInputStream()))) {
foundProgram = Paths.get(reader.readLine());
}
LOGGER.info(desiredProgram + " has been found at : " + foundProgram);
} else {
LOGGER.warning(desiredProgram + " not in PATH");
}
} catch (IOException | InterruptedException ex) {
LOGGER.warning("Something went wrong while searching for " + desiredProgram);
}
return foundProgram;
}
private static boolean isWindows() {
return System.getProperty("os.name").toLowerCase().contains("windows");
}
}
Чтобы использовать его:
System.out.println(SimulationUtils.lookForProgramInPath("notepad"));
В моей системе Windows 7, он отображает:
C: \ Windows \ System32 \ notepad.exe
И по линуксу:
System.out.println(SimulationUtils.lookForProgramInPath("psql"));
/USR/бен/PSQL
Преимущество этого метода заключается в том, что он должен работать на любой платформе, и нет никакой необходимости разобрать переменную окружения PATH или посмотреть на реестр. Желаемая программа никогда не вызывается, даже если она найдена. Наконец, нет необходимости знать расширение программы. gnuplot.exe под Windows, и под Linux Gnuplot бы как можно найти одним и тем же кодом:
SimulationUtils.lookForProgramInPath("gnuplot")
Предложения по улучшению приветствуются!
Я думаю, что было бы лучше сделать «который СВН» вместо «СВН помощи». Он по-прежнему будет давать правильный код возврата относительно того, существует или нет svn в пути, но с успехом вы также получите полный путь к исполняемому файлу svn. – Apreche
"который" не является командой Windows. – EMMERICH
«где» - эквивалент Windows, «который» –