Come si esegue un programma che non si sa dove iniziano gli argomenti?
-
03-07-2019 - |
Domanda
L'argomento non dice molto perché non è facile mettere in discussione in una riga.
Devo eseguire alcuni programmi che ho letto dal registro. Devo leggere da un campo in cui qualcuno salva tutti i percorsi e gli argomenti.
Sto usando System.Diagnostics.ProcessStartInfo impostando il nome del programma e i suoi argomenti, ma ho trovato una grande varietà di argomenti che devo analizzare per salvare il file eseguibile del processo in un campo e i suoi argomenti nell'altro.
Esiste un modo per eseguire l'intera stringa così com'è?
Soluzione
L'ho affrontato allo stesso modo del poster sopra, usando cmd.exe con le informazioni di avvio del processo.
Process myProcess = New Process;
myProcess.StartInfo.FileName = "cmd.exe";
myProcess.StartInfo.Arguments = "/C " + cmd;
myProcess.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
myProcess.StartInfo.CreateNoWindow = True;
myProcess.Start();
myProcess.WaitForExit();
myProcess.Close();
cmd / c esegue il comando e quindi termina. WaitForExit interromperà il processo se viene eseguito troppo a lungo.
Altri suggerimenti
Ce ne sono diversi, in effetti.
- È possibile chiamare cmd.exe con / C [la riga di comando] come argomenti. Questo fa sì che cmd.exe elabori il tuo comando e quindi esca.
- È possibile scrivere il comando in un file batch e avviarlo.
E ovviamente c'è l'approccio che stai adottando ora, ovvero l'analisi della riga di comando.
Quando ' UseShellExecute ' è non impostato, System.Diagnostics.Process chiama CreateProcess o CreateProcessAsUser per avviare effettivamente un programma (utilizza il secondo uno se si specifica un utente / dominio / password). Entrambe le chiamate possono prendere il comando e il file come un singolo argomento. Da MSDN:
Il parametro lpApplicationName può essere NULLO. In tal caso, il nome del modulo deve essere il primo bianco spazio & # 8211; token delimitato nel file stringa lpCommandLine. ...
il nome lpApplication esegue il mapping a ProcessStartInfo.Filename e lpCommandLine esegue il mapping agli argomenti. Quindi dovresti andare anche solo:
var processStartInfo = new ProcessStartInfo()
{
UseShellExecute = false,
Arguments = cmd
};
Process.Start(processStartInfo);