questo codice utilizza il comando "where" su Windows e il comando "which" su altri sistemi, per verificare se il sistema conosce il programma desiderato in PATH. Se trovato, la funzione restituisce un java.nio.file.Path al programma e null in caso contrario.
L'ho provato con Java 8 su Windows 7 e 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");
}
}
Per utilizzarlo:
System.out.println(SimulationUtils.lookForProgramInPath("notepad"));
Sul mio sistema Windows 7, viene visualizzato:
C: \ Windows \ System32 \ notepad.exe
E su linux:
System.out.println(SimulationUtils.lookForProgramInPath("psql"));
/usr/bin/psql
Il vantaggio di questo metodo è che dovrebbe funzionare su qualsiasi piattaforma e non c'è alcuna necessità di analizzare la variabile d'ambiente PATH o guardare il Registro di sistema. Il programma desiderato non viene mai chiamato, anche se trovato. Infine, non è necessario conoscere l'estensione del programma. gnuplot.exe sotto Windows e gnuplot sotto Linux verrebbero entrambi trovati con lo stesso codice:
SimulationUtils.lookForProgramInPath("gnuplot")
Suggerimenti per il miglioramento sono i benvenuti!
fonte
2016-06-28 10:43:05
penso che sarebbe meglio fare "che svn" invece di "aiuto svn". Continuerà a fornire il codice di ritorno appropriato se svn esiste nel percorso, ma in caso di successo si otterrà anche il percorso completo all'eseguibile svn. – Apreche
"which" non è un comando di Windows. – EMMERICH
"where" è l'equivalente di Windows di "which" –