2014-07-23 7 views
5

J'utilise le code suivant pour exécuter une commande de console Linux via Mono dans une application C#:Exécution d'une commande console Linux en C#

ProcessStartInfo procStartInfo = new ProcessStartInfo("/bin/bash", "-c ls"); 
procStartInfo.RedirectStandardOutput = true; 
procStartInfo.UseShellExecute = false; 
procStartInfo.CreateNoWindow = true; 

System.Diagnostics.Process proc = new System.Diagnostics.Process(); 
proc.StartInfo = procStartInfo; 
proc.Start(); 

String result = proc.StandardOutput.ReadToEnd(); 

Cela fonctionne comme prévu. Mais, si je donne la commande comme "-c ls -l" ou "-c ls /path" je reçois toujours la sortie avec le -l et path ignorés.

Quelle syntaxe dois-je utiliser pour utiliser plusieurs commutateurs pour une commande?

+2

Vous pouvez essayer d'utiliser 'ProcessStartInfo.Arguments' pour voir si la méthode alternative fonctionne? Aussi avez-vous besoin de/bin/bash? Ne pouvez-vous pas simplement lancer 'ls' directement? – cjb110

+0

@ cjb110 non cela ne fonctionne pas. Oui, vous devez définir/bin/bash comme nom de fichier ou il ne peut pas trouver l'exécutable bash seul. – ravindu1024

+0

Essayez peut-être RedirectStandardInput et envoyez les commandes. Je ne connais pas le code exact, mais je sais que vous pouvez le faire pour envoyer des commentaires au processus. Voici un exemple: http://msdn.microsoft.com/en-us/library/system.diagnostics.processstartinfo.redirectstandardinput(v=vs.110).aspx – NewfrontSolutions

Répondre

2

Vous avez oublié de citation la commande.

Avez-vous essayé ce qui suit à l'invite bash? Je suggère fortement de lire le man bash. Et aussi le manuel getopt car c'est ce que bash utilise pour analyser ses paramètres. Il a exactement le même comportement que bash -c ls Pourquoi? Parce que vous devez dire à bash que ls -l est l'argument complet de -c, sinon -l est traité comme un argument de bash. Soit bash -c 'ls -l' ou bash -c "ls -l" fera ce que vous attendez. Vous devez ajouter des guillemets comme ceci:

ProcessStartInfo procStartInfo = new ProcessStartInfo("/bin/bash", "-c 'ls -l'"); 
+1

bash -c 'ls -l' est presque identique à bash -c "ls -l" mais ne nécessite pas d'échappement dans la chaîne C# – user1709408