web-dev-qa-db-fra.com

Utiliser Process.Start avec des paramètres ET des espaces dans le chemin

J'ai vu des exemples similaires, mais je ne trouve pas quelque chose exactement comme mon problème.

J'ai besoin d'exécuter une commande comme celle-ci à partir de C #:

C:\FOLDER\folder with spaces\OTHER_FOLDER\executable.exe p1=hardCodedv1 p2=v2

Je configure la v2 à l'exécution, j'ai donc besoin de pouvoir modifier la chaîne en C # avant d'appeler Process.Start. Quelqu'un sait-il comment gérer cela, car j'ai des espaces entre mes paramètres?

29
WEFX

Vous pouvez utiliser la classe ProcessStartInfo pour séparer vos arguments, FileName, WorkingDirectory et arguments sans vous soucier des espaces

string fullPath = @"C:\FOLDER\folder with spaces\OTHER_FOLDER\executable.exe"
ProcessStartInfo psi = new ProcessStartInfo();
psi.FileName = Path.GetFileName(fullPath);
psi.WorkingDirectory = Path.GetDirectoryName(fullPath);
psi.Arguments = "p1=hardCodedv1 p2=" + MakeParameter();
Process.Start(psi);

où MakeParameter est une fonction qui renvoie la chaîne à utiliser pour le paramètre p2

20
Steve

Même lorsque vous utilisez la classe ProcessStartInfo, si vous devez ajouter des espaces pour les arguments, les réponses ci-dessus ne résoudront pas le problème. Il existe une solution simple. Ajoutez simplement des guillemets autour des arguments. C'est tout.

 string fileName = @"D:\Company Accounts\Auditing Sep-2014 Reports.xlsx";
 System.Diagnostics.ProcessStartInfo startInfo = new System.Diagnostics.ProcessStartInfo();
 startInfo.FileName = "Excel.exe";
 startInfo.Arguments = "\"" + fileName + "\"";
 System.Diagnostics.Process.Start(startInfo);

Ici, j'ai ajouté des guillemets d'échappement autour du nom de fichier, et cela fonctionne.

23
Sayka

Essaye ça

ProcessStartInfo startInfo = new ProcessStartInfo();
startInfo.CreateNoWindow = false;
startInfo.UseShellExecute = false;
startInfo.FileName =  "\"C:\\FOLDER\\folder with   spaces\\OTHER_FOLDER\\executable.exe\"";
startInfo.Arguments = "p1=hardCodedv1 p2=v2";
Process.Start(startInfo);
6
Swapnil

Après avoir examiné les autres solutions fournies, j'ai rencontré le problème où tous mes différents arguments étaient regroupés en un seul argument.

c'est à dire. "-setting0=arg0 --subsetting0=arg1"

Je proposerais donc ce qui suit:

        ProcessStartInfo psi = new ProcessStartInfo();
        psi.FileName = "\"" + Prefs.CaptureLocation.FullName + "\"";
        psi.Arguments = String.Format("-setting0={0} --subsetting0={1}", "\"" + arg0 + "\"", "\"" + arg1+ "\"");
        Process.Start(psi);

Avec les guillemets autour de chaque argument, au lieu de l'ensemble de l'ensemble des arguments. Et comme indiqué par Red_Shadow tout cela peut être fait avec la seule ligne

        Process.Start("\"" + filename + "\"", arguments here)
2
Peet