2010-09-29 3 views
5

Je rencontre un problème lors de l'appel d'un fichier de commandes à partir d'un autre fichier de commandes lorsque j'essaie de tout exécuter en utilisant Process.Start. Fondamentalement, j'appelle l'exécution d'un fichier batch de mon programme C# qui ressemble à ceci:Inclure un fichier de commandes dans un fichier de commandes


call include.bat 

//execute the rest of the batch file here 

Le fichier include.bat met en place des chemins et peut être utilisé par un certain nombre d'autres fichiers de traitement par lots. Lorsque je cours le Process.Start parfois cela fonctionne et parfois je reçois ERROR: cannot find include.bat. Tout d'abord une idée de pourquoi cela arrive? Et des idées sur la façon de résoudre ce problème à partir du fichier batch?

Répondre

7

Pour passer au répertoire de votre fichier batch est situé dans, utilisez:

cd %~dp0 

Je le fais dans presque tous mes scripts de traitement par lots. De cette façon, les chemins relatifs devraient toujours fonctionner.

+0

merci pour cela – Dimitris

+0

Vous pouvez le marquer comme réponse si elle a résolu votre problème. :) – Botz3000

+1

J'ai l'habitude de définir un var afin que le script soit plus lisible: SET CDIR =% ~ dp0 – djangofan

1

La première chose que j'essaierais est d'utiliser les informations de chemin complet dans l'instruction call pour include.bat. Si cela résout, vous n'exécutez probablement pas le fichier de commandes à partir de l'emplacement approprié. Je suis sûr qu'il y a une capacité de "répertoire de travail" en C#, je ne suis pas sûr de ce que c'est.

1

Définissez-vous ProcessStartInfo.WorkingDirectory (http://msdn.microsoft.com/en-us/library/system.diagnostics.processstartinfo.workingdirectory.aspx) sur ProcessStartInfo que vous passez à Process.Start?

Comme include.bat est parfois introuvable, le répertoire de travail peut être erroné (pas le dossier où se trouve include.bat).

+0

Je dois admettre que je ne fais pas cela. Est-il possible de le réparer au moins temporairement à partir du fichier batch? – Dimitris

+0

Utilisez cd% ~ dp0 comme indiqué par Botz3000 ci-dessus. –

+0

merci pour cela – Dimitris

2

Avant le script, essayez CD /D %~dp0

+1

Votre droit possible. Il se peut que le CD ne fonctionne pas s'il doit passer à une lettre de lecteur différente, mais avec le commutateur/D, peut-être le ferait-il. Je n'ai pas essayé mais c'est une bonne idée ... – djangofan

2

Je sais que c'est une vieille question, mais je pensais que ce serait intéressant de noter que l'approche préconisée par la réponse acceptée (à savoir changer le répertoire de travail) ne peut pas toujours approprié.

Une meilleure approche générale est de se référer aux dépendances par chemin complet:

call "%~dp0include.bat" 

(depuis% ~ dp0 se termine déjà avec une barre oblique inverse, on n'a pas besoin d'ajouter un autre.)

Voici quelques avantages de ne en changeant le répertoire de travail:

  1. Le reste du fichier de commandes peut toujours utiliser le répertoire de travail d'origine.
  2. Le répertoire de travail d'origine dans l'invite de commande est conservé, même sans "SETLOCAL".
  3. Si le premier fichier de traitement par lots est exécuté via un chemin d'accès UNC (tel que "\\ server \ share \ file.bat"), l'appel de chemin complet aboutira changing the directory (even with "cd /d") will fail. (L'utilisation de pushd/popd gérerait ce point, mais ils ont leur propre ensemble de problèmes.)

Ces avantages sont particulièrement importants pour les fichiers batch de type alias, même s'ils ne sont pas aussi importants pour la situation spécifique motivé cette question.

Questions connexes