Maison > développement back-end > C++ > Pourquoi le chemin du fichier batch %~dp0 agit-il différemment lorsqu'il est appelé depuis C# ou directement ?

Pourquoi le chemin du fichier batch %~dp0 agit-il différemment lorsqu'il est appelé depuis C# ou directement ?

Linda Hamilton
Libérer: 2025-01-09 21:51:42
original
232 Les gens l'ont consulté

Why Does the %~dp0 Batch File Path Act Differently When Called from C# vs. Directly?

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>
Copier après la connexion

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# :

  • Éviter les guillemets : La solution la plus simple est d'éviter d'utiliser des guillemets lors de l'appel du fichier batch depuis C#. Utilisez une commande comme cmd /c batchfile.cmd au lieu de "cmd /c "batchfile.cmd".
  • Utiliser le chemin complet : Si les guillemets sont inévitables, fournissez toujours le chemin complet du fichier batch dans l'appel C#. Cela garantit que cmd.exe a le chemin absolu correct quel que soit le répertoire de travail.

Pour l'exécution de fichiers par lots :

  • Récupération robuste du chemin : L'approche la plus fiable dans le fichier batch lui-même consiste à utiliser un sous-programme pour obtenir le chemin du script actuel. Cette méthode contourne les incohérences causées par les citations et les changements de répertoire :
<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>
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal