Comprendre l'écart dans les références de chemin de fichier batch (%~dp0)
Le comportement de %~dp0
dans les fichiers batch peut varier en fonction de la façon dont le fichier batch est exécuté, en particulier lorsque l'on compare l'exécution directe par rapport à l'exécution à partir d'un programme C#. Cette différence provient de la façon dont cmd.exe
gère la variable %~0
et ses modificateurs.
Le problème :
Considérons un fichier batch avec ces lignes :
<code class="language-batch">echo %~dp0 cd Arvind echo %~dp0</code>
Lorsqu'il est exécuté directement, le changement du répertoire en "Arvind" n'affecte pas la sortie de %~dp0
. Cependant, si ce même fichier batch est appelé depuis un programme C#, le deuxième echo %~dp0
sera reflétera le nouveau répertoire ("Arvind").
La cause profonde :
Le problème principal réside dans l'interprétation que cmd.exe
fait de %~0
. La variable %~0
, ainsi que des modificateurs tels que ~d
(lettre de lecteur) et ~p
(chemin), accède aux informations de la représentation interne du fichier de commandes en cours d'exécution.
La différence cruciale réside dans la manière dont la citation affecte cette référence interne. Si %~0
n'est pas cité, la référence interne pointe correctement vers le chemin complet du fichier batch. Cependant, si l'appel au fichier batch est entre guillemets (ce qui est courant dans les interactions C#), cmd.exe
supprime les guillemets, conduisant potentiellement à une interprétation du chemin relatif au lieu du chemin absolu. Cette interprétation du chemin relatif change ensuite en fonction du répertoire de travail actuel.
Solutions :
Pour l'exécution C# :
cmd /c batchfile.cmd
au lieu de "cmd /c "batchfile.cmd"
.cmd.exe
a le chemin absolu correct quel que soit le répertoire de travail.Pour l'exécution de fichiers par lots :
<code class="language-batch">@echo off setlocal enableextensions disabledelayedexpansion call :getCurrentBatchPath myBatchPath echo %myBatchPath% cd Arvind echo %myBatchPath% exit /b :getCurrentBatchPath set "%~1=%~f0" goto :eof</code>
Ce sous-programme utilise %~f0
(qui fournit toujours le chemin complet) pour stocker le chemin dans la variable spécifiée (myBatchPath
dans cet exemple). La variable reste alors cohérente même après avoir changé de répertoire.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!