2010-02-26 6 views
1

Je cherche un moyen d'exécuter DOS/Windows directement à partir du code C# sans l'enregistrer en tant que fichier .BAT avant. Je suis principalement intéressé par exécuter une commande DOS avec une combinaison de flux stdin.Comment exécuter la commande de lot complexe à la volée

Disons que je dois exécuter quelque chose comme ça:

echo 'abcd' | programXXX.exe -arg1 --getArgsFromStdIn 

Après que programXXX.exe prendra chaîne « abcd » comme -arg1

Ce que je fais est juste créer chauve-souris fichier dans le répertoire TMP et en cours d'exécution, la suppression après l'exécution. Ce dont j'ai besoin, c'est de l'exécuter "à la volée" à partir du code .NET sans l'enregistrer au préalable.
(La raison principale est la sécurité, mais aussi ne veut pas laisser des déchets quand le programme se bloque, etc.)

Savez-vous comment y parvenir?

+0

Voulez-vous exécuter des commandes uniques ou des fichiers batch (complexes)? –

+0

Je voudrais exécuter plus d'une commande de ligne – Maciej

Répondre

1

Je propose deux suggestions

  1. utilisation redirigée IO et lancer le programme à partir de votre code
  2. vous pouvez utiliser shell de puissance comme dans ce tutorial
2

Vous pouvez utiliser Process.Start.

Il faudra plusieurs paramètres, et vous pouvez passer à travers les paramètres de la ligne de commande.

+0

Bon pour les commandes, pas pour les fichiers temporaires Batch –

+0

Il veut éviter les fichiers batch temporaires. – Oded

+0

Je veux absolument éviter les fichiers temporaires! @Oded - vouliez-vous dire (dans cet exemple particulier) j'utiliser RedirectStandardInput = true lors du démarrage du processus? – Maciej

1

Un commutateur à PowerShell (PSH) vous donnerait une plus grande capacité à exécuter des commandes. PSH exécute en cours et plusieurs lignes de commande peut être exécutée en une seule runspace (portée/contexte) avec un contrôle total sur les pipelines d'entrée et objet de sortie:

var runspace = RunspaceFactory.CreateRunspace(); 
PSSnapInException pex; 
var loadedSnapIn = Runspace.RunspaceConfiguration.AddPSSnapIn(SnapInName, out pex); 
runspace.Open(); 
var pipe = runspace.CreatePipeline(commandline); 
var output = pipe.Invoke(); 

Cela crée l'espace d'exécution, charge un snapin (par exemple sur commande supplémentaire commandes), configure une commande et l'exécute, collectant la collection des objets retournés.

Questions connexes