|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Mar 2008
Messaggi: 401
|
[Java] exec, dos... e l'output?
Salve a tutti.
Sto scrivendo un'applicazione in java, dove uso il metodo exec per inviare un comando al dos di windows, così: Codice:
String arguments[] = {"cmd", "/C", "start", command};
Runtime.getRuntime().exec(arguments); //qui in un blocco try/catch che cattura una IOException
Come posso fare? Esite qualche classe apposita? Grazie a tutti |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Process p = Runtime.getRuntime().exec(arguments);
Con p.getInputStream() ottieni un InputStream da leggere con i vari modi possibili...ad esempio tramite un BufferedReader. |
|
|
|
|
|
#3 |
|
Senior Member
Iscritto dal: Mar 2008
Messaggi: 401
|
Grazie mille cionci, provo e vi faccio sapere
|
|
|
|
|
|
#4 |
|
Senior Member
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
|
@mm8:
Forse non riuscirai a catturare l'InputStream del processo "command", passando alla exec() quei parametri... Provo a spiegarmi: con questa stringa di argomenti ("cmd", "/C", "start", "command") cosa succede quando la exec li processa? Succede che vengono creati 2 processi esterni: 1) "cmd" + "/C" la JVM lancia cmd.exe come processo esterno: è questo il processo esterno al quale appartengono gli stream ottenuti con process.getInputStream() / outputStream. Questo perchè la creazione del processo esterno è contestualizzata a partire dalla JVM corrente; inoltre, in questo caso (cmd.exe), è l'ambiente di runtime Java della tua applicazione ad essere responsabile dello svuotamento dei buffer di I/O del processo. Il parametro "/C" viene passato a "cmd" come suo argomento, e significa solo che la finestra consolle del processo esterno va nascosta. 2) "start" + "command" in questo caso viene passato al processo esterno del punto precedente (cmd.exe) un comando ammissibile (start): questo comando ha l'effetto di lanciare un secondo processo (command) specificando che girerà in un'altra finestra consolle dedicata. In questo caso il secondo processo (command) vede la sua creazione contestualizzata a partire dal processo (cmd.exe) e non a partire dalla JVM, inoltre i suoi buffer di I/O sono gestiti automaticamente dal SO in quanto gli è stata dedicata una sua finestra consolle (vedere documentazione comando "start" di cmd.exe). Morale della favola, quando fai: Codice:
String arguments[] = {"cmd", "/C", "start", command};
Process p = Runtime.getRuntime().exec(arguments);
Codice:
InputStram is = p.getInputStream(); Ciao.
__________________
As long as you are basically literate in programming, you should be able to express any logical relationship you understand. If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it. (Chris Crawford) |
|
|
|
|
|
#5 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Vero, non l'avevo notato
|
|
|
|
|
|
#6 |
|
Senior Member
Iscritto dal: Mar 2008
Messaggi: 401
|
Ok, quindi deduco che dovrei prendermi la responsabilità di gestire i buffer di io del processo.
Ma per fare questo, come posso fare? Devo utilizzare un qualche metodo della classe Input/OutputStream? |
|
|
|
|
|
#7 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Quello che ti vuole dire è che con il comando sopra fai avviare due processi, uno è cmd e l'altro è quello contenuto in command. In questo modo tu hai il controllo solo sull'I/O di cmd
|
|
|
|
|
|
#8 | |
|
Senior Member
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
|
Quote:
Te ne posto una recentissima: http://www.hwupgrade.it/forum/showthread.php?t=1906195 Intanto visto che vuoi lanciare un processo esterno e collegarti ai suoi stream/buffer comincia col passare alla exec() gli argomenti in modo da creare e lanciare un solo processo. Ad esempio: Codice:
// lancia cmd forzando la visualizzazione della consolle
String[] cmdViewConsolle = {"cmd", "/K"};
// lancia cmd nascondendo la consolle: senza altri comandi non avrebbe senso perchè il processo terminerebbe subito dopo aver creato e nascosto la consolle
String[] cmdSlaveProcess = {"cmd", "/C", "applicativoEsternoConOutput.exe"};
// lancia cmd nascondendo la consolle, quindi lancia come processo con consolle dedicata (i buffer sono gestiti dal SO) "applicativoEsternoConOutput.exe"
String[] cmdAutoProcess = {"cmd", "/C", "start", "applicativoEsternoConOutput.exe"};
// lancia cmd nascondendo la consolle e manda in esecuzione il file myscript.bat: un altro esempio.
String[] cmdBatfile = {"cmd", "/C", "myscript.bat"};
// esempio: mandare in esecuzione un processo esterno che produce output su cui si vuole mettere le mani:
Process process = Runtime.getRuntime().exec(cmdSlaveProcess);
InputStream is = process.getInputStream();
OutputStream os = process.getOutputStream();
// usa gli stream come ti pare.
// ricordati che se il processo che hai lanciato con cmd è un applicativo che generà output devi svuotarne il buffer relativo, pena il rischio di saturamento del buffer stesso
__________________
As long as you are basically literate in programming, you should be able to express any logical relationship you understand. If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it. (Chris Crawford) Ultima modifica di banryu79 : 21-01-2009 alle 14:34. |
|
|
|
|
|
|
#9 |
|
Senior Member
Iscritto dal: Mar 2008
Messaggi: 401
|
Chiarissimo, mi rimane solo un dubbio: come svuoto i buffer? C'è un metodo nelle classi Input/OutputStream? Inoltre quando devo svuotarli? Dopo un certo numero di tempo? Dopo un certo numero di caratteri... ho bisogno di delucidazioni.
Ultima modifica di agente mm8 : 21-01-2009 alle 14:46. |
|
|
|
|
|
#10 | |
|
Senior Member
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
|
Quote:
Se esamini quello che il forum ha già da offrirti tramite la funzione di ricerca, fidati, troverai risposta al tuo quesito.
__________________
As long as you are basically literate in programming, you should be able to express any logical relationship you understand. If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it. (Chris Crawford) |
|
|
|
|
|
|
#11 |
|
Junior Member
Iscritto dal: Sep 2015
Messaggi: 2
|
ragazzi per fare il modo che la finestra dos non venga chiusa dopo che si è completata l'esecuzione del comando c'è?
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 09:56.




















