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'è?

È stato utile?

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.

  1. È 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.
  2. È 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);
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top