ten kod wykorzystuje polecenie "where" w systemie Windows i polecenie "which" w innych systemach, aby sprawdzić, czy system wie o pożądanym programie w PATH. Jeśli zostanie znaleziona, funkcja zwróci plik java.nio.file.Path do programu i null w przeciwnym razie.
Przetestowałem to z Java 8 na Windows 7 i 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");
}
}
Aby go użyć:
System.out.println(SimulationUtils.lookForProgramInPath("notepad"));
W moim systemie Windows 7 wyświetla:
C: \ Windows \ System32 \ notepad.exe
I na Linux:
System.out.println(SimulationUtils.lookForProgramInPath("psql"));
/usr/bin/psql
Zaletą tej metody jest to, że powinien działać na każdej platformie i nie ma potrzeby analizowania zmiennej środowiskowej PATH lub szukać w rejestrze. Żądany program nigdy nie jest wywoływany, nawet jeśli został znaleziony. Wreszcie, nie trzeba znać rozszerzenia programu. gnuplot.exe w systemie Windows i gnuplot pod Linuksem można znaleźć pod tym samym kodem:
SimulationUtils.lookForProgramInPath("gnuplot")
Sugestie do poprawy są mile widziane!
myślę, że byłoby lepiej, aby zrobić "który svn" zamiast "svn help". Nadal będzie podawał prawidłowy kod powrotu, czy svn istnieje w ścieżce, czy też nie, ale po sukcesie otrzymasz pełną ścieżkę do pliku wykonywalnego svn. – Apreche
"który" nie jest poleceniem Windows. – EMMERICH
"gdzie" jest odpowiednikiem Windowsa "który" –