2 votes

Comment exécuter un fichier batch à partir de C# ?

(Voir la fin pour la solution)

Je ne pensais pas que ça allait être difficile. J'ai un fichier de commande, D : \a.cmd qui contient :

copy /b d:\7zS.sfx + d:\config.txt + d:\files.7z d:\setup.exe

Mais ces lignes de C# ne l'exécuteront pas :

Process.Start("d:\\a.cmd");
Process.Start("cmd", "/c d:\\a.cmd");

Lance une Win32Exception : "%1 n'est pas une application Win32 valide".

Process.Start ouvre les fichiers .pdf... pourquoi pas les fichiers de commande ?

Cela fonctionne si je le tape dans une fenêtre cmd :

cmd /c d:\a.cmd

Windows XP, MS Visual Studio 2008.

Merci d'avance, Jim

SOLUTION Je ne suis que légèrement gêné :( Il y avait un fichier nommé cmd.exe, de taille zéro dans le répertoire de mon application. Je n'ai aucune idée de comment il est arrivé là mais il est maintenant grillé et les deux instructions C# ci-dessus fonctionnent maintenant. Je vais chercher un livre de Harry Potter pour que Dobby me donne des idées d'auto-punition...

2voto

MainMa Points 10849

Ou vous pouvez créer un fichier .bat puis appeler ce fichier par System.Diagnostics.Process.Start() . Il ne redirigera pas la sortie vers l'application Console, mais il exécutera certainement les commandes qu'elle contient.

2voto

stakx Points 29832

J'ai quatre choses pour vous que vous pouvez essayer :

(1) Essayez de fournir le chemin complet pour cmd.exe (par exemple, sur ma machine : C:\WINDOWS\SYSTEM32\CMD.EXE ).


(2) Essayez d'ajouter call à la commande à exécuter :

Process.Start(@"C:\WINDOWS\SYSTEM32\CMD.EXE", @"/c call D:\a.cmd");

(3) A part ça, je ne peux que deviner où le %1 en el Win32Exception vient de. Peut-être que vos associations de fichiers sont mal configurées.

Si vous tapez ce qui suit sur la ligne de commande :

> assoc .cmd

Vous obtiendrez probablement une mention de cmdfile . Si vous recherchez alors ce jeton avec :

> ftype cmdfile

Vous pourriez obtenir une réponse du type :

cmdfile="%1" %*

Ces paramètres sont stockés dans le registre, et c'est ainsi que l'interpréteur de ligne de commande sait comment exécuter les fichiers avec des extensions personnalisées. (Vous pouvez découvrir comment un document PDF est démarré en exécutant les deux instructions ci-dessus pour la commande .pdf extension.)


(4) Si vous commencez à soupçonner que votre machine est mal configurée, lancez regedit (l'éditeur de registre) et localisez la clé HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Command Processor .

Sur ma machine Windows XP (et votre Process.Start exemple fonctionne sur ma machine, avec des noms de fichiers différents cependant), j'ai les valeurs suivantes stockées là-dedans :

//  Name                Type        Value
//  -----------------------------------------------
//  (standard)          REG_SZ      (not set)
//  AutoRun             REG_SZ
//  CompletionChar      REG_DWORD   0x00000040 (64)
//  DefaultColor        REG_DWORD   0x00000000 (0)
//  EnableExtensions    REG_DWORD   0x00000001 (1)
//  PathCompletionChar  REG_DWORD   0x00000040 (64)

Parmi ceux-ci, les AutoRun pourrait être d'un certain intérêt. Je pense qu'elle correspond à la /d le commutateur de ligne de commande de cmd.exe qui contrôle si cmd.exe tente de lancer des fichiers avec des extensions personnalisées. En général, cette fonction est activée. Peut-être que sur votre machine, ce n'est pas le cas ?

2voto

SchlaWiener Points 9682

Vous devez spécifier le nom complet du processus (cmd.exe).
Vous devriez essayer

Environment.GetFolderPath(Environment.SpecialFolder.System) + "cmd.exe"

Vous pouvez donc être sûr d'exécuter le bon fichier, même si un cmd.exe se trouve dans votre répertoire d'applications.

1voto

P Daddy Points 14228

Il semble qu'il y ait un problème avec votre ordinateur. Essayez de l'exécuter sur une autre machine. Ce site devrait travail. Process.Start(string) utilise ShellExecuteEx pour lancer le fichier, ce qui revient à peu près au même que de double-cliquer sur le fichier dans l'Explorateur, comme vous le supposiez.

Un simple test a fonctionné pour moi.

B:\foo.cmd :

@echo Hello from foo.cmd!
@pause

Programme.cs :

class Program{
    static void Main(){
        System.Diagnostics.Process.Start("B:\\foo.cmd");
    }
}

Cela fonctionne comme prévu.

Votre message d'erreur est suspect, "%1 n'est pas une application Win32 valide". La valeur dans mon registre à HKCR \cmdfile\shell\open\command es

"%1" %*

El %1 est remplacé par le nom du fichier, et l'élément %* peut être ignoré ici (il indique que tout autre argument de ligne de commande doit être transmis, mais nous ne sommes pas concernés par cela pour le moment).

Le fait que le fichier lui-même soit lancé pour traiter ce type de fichier indique que Windows lui-même sait comment lancer ce type de fichier. Sur une installation normale de Windows, les extensions suivantes doivent être configurées de manière similaire :

  • .exe <em>Fichiers exécutables Windows et DOS</em>
  • .com <em>Fichiers de "commande" DOS</em>
  • .bat <em>Fichiers batch Windows et DOS</em>
  • .cmd <em>Fichiers batch de Windows NT</em>
  • .pif <em>Raccourcis Windows vers les fichiers exécutables DOS</em>

Si vous allez à HKCR\.xxx (donde xxx est l'un des éléments ci-dessus), la valeur "(Défaut)" doit être xxxfile . Si vous allez ensuite sur HKCR\xxxfile\shell\open\command la valeur "(Default)" doit être la suivante "%1" %* . De même, la valeur "(Default)" de l'option HKCR\xxxfile\shell doit être soit non défini, soit open .

Si vous avez autre chose dans l'une de ces valeurs, c'est qu'un programme a tenté de s'insérer dans le processus d'exécution. Les virus le font parfois ( Sircam par exemple).

0voto

Thanatos Points 13444

Avez-vous essayé d'exécuter cmd.exe et en lui passant le fichier .cmd comme argument ?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X