Programmation Java: appeler un exe depuis Java et passer des paramètres

87

Je suis en train de trouver un mécanisme pour appeler un exe à partir de Java et en passant des paramètres spécifiques. Comment puis-je faire?

Process process = new ProcessBuilder("C:\\PathToExe\\MyExe.exe").start();
InputStream is = process.getInputStream();
InputStreamReader isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);
String line;

System.out.printf("Output of running %s is:", Arrays.toString(args));

while ((line = br.readLine()) != null) {
  System.out.println(line);
}

Le code précédent fonctionne. Mais je ne suis pas en mesure de transmettre des paramètres . MyExe.exe accepte les paramètres. Un autre problème est lorsque PathToExe a des espaces vides. ProcessBuilder semble ne pas fonctionner. Par exemple:

C:\\User\\My applications\\MyExe.exe

Merci.

Lorenzo B
la source
1
nouveau ProcessBuilder ("C: \\ PathToExe \\ MyExe.exe", "param1", "param2"). start ();
Prince John Wesley le
1
new ProcessBuilder("C:\\PathToExe\\MyExe.exe","param1","param2").start();Cet extrait est-il utile pour les arguments d'option? Par exemple -h qui signifie aide et ainsi de suite ..
Lorenzo B
qu'en est-il des chemins avec des espaces vides? Merci encore. Très utile!!
Lorenzo B
3
@Flex: Un argument est un argument. La signification de l'argument dépend entièrement du programme en cours d'exécution. Un programme pourrait interpréter -hcomme une option, un autre pourrait l'interpréter comme un nom de fichier. ProcessBuilderne sait ni ne s'en soucie. Re chemins avec des espaces: C'est l'une des raisons pour lesquelles les arguments sont donnés sous forme de chaînes discrètes plutôt que comme (disons) une liste délimitée par des espaces comme sur la ligne de commande et dans certaines API pauvres. Ajoutez des espaces là-dedans avec abandon, tout le chemin du programme sera donné au système d'exploitation pour le traiter comme il convient.
TJ Crowder

Réponses:

119

Passez vos arguments dans le constructeur lui-même.

Process process = new ProcessBuilder("C:\\PathToExe\\MyExe.exe","param1","param2").start();
Prince John Wesley
la source
Et si l'exécutable se trouve dans le fichier Jar?
t4d_
@Les gars. Aidez-nous à résoudre stackoverflow.com/questions/43050217/…
gstackoverflow
8

Vous êtes sur la bonne voie. Les deux constructeurs acceptent les arguments, ou vous pouvez les spécifier après la construction avec ProcessBuilder#command(java.util.List)et ProcessBuilder#command(String...).

TJ Crowder
la source
Pour plus de précision: ProcessBuilder#command(java.util.List)et ProcessBuilder#command(String...)owerwrite toutes les commandes existantes spécifiées via le constructeur (à mon avis, ce n'est pas très clair dans la documentation).
Snozzlebert
0
import java.io.IOException;
import java.lang.ProcessBuilder;

public class handlingexe {
    public static void main(String[] args) throws IOException {
        ProcessBuilder p = new ProcessBuilder();
        System.out.println("Started EXE");
        p.command("C:\\Users\\AppData\\Local\\Google\\Chrome\\Application\\chrome.exe");   

        p.start();
        System.out.println("Started EXE"); 
    }
}
Shikha Chauhan
la source
1
Où mettre les arguments?
Mert Serimer le
1
@Shikha, veuillez passer en revue la question
Anand j. Kadhi
0

Ci-dessous fonctionne pour moi si votre exe dépend d'une DLL ou d'une certaine dépendance, vous devez définir le chemin du répertoire. Comme mentionné ci-dessous exePath signifie dossier où exe est placé avec ses fichiers de références.

Application Exe créant n'importe quel fichier temporaire afin qu'il crée dans le dossier mention dans processBuilder.directory (...)

**

ProcessBuilder processBuilder = new ProcessBuilder(arguments);
processBuilder.redirectOutput(Redirect.PIPE);
processBuilder.directory(new File(exePath));
process = processBuilder.start();
int waitFlag = process.waitFor();// Wait to finish application execution.
if (waitFlag == 0) {
...
 int returnVal = process.exitValue();
} 

**

user3124811
la source