Maison >développement back-end >C++ >Pourquoi %~dp0 donne-t-il des résultats différents lorsqu'un fichier batch est exécuté directement ou via C# ?

Pourquoi %~dp0 donne-t-il des résultats différents lorsqu'un fichier batch est exécuté directement ou via C# ?

Barbara Streisand
Barbara Streisandoriginal
2025-01-09 21:49:45282parcourir

Why Does %~dp0 Yield Different Results When a Batch File is Executed Directly vs. via C#?

%~dp0 différence de référence de chemin dans le fichier batch

Contexte :

Dans le fichier batch, %~dp0 représente le chemin du répertoire de l'emplacement actuel du fichier batch. Lors du changement du répertoire actuel (CD), il est généralement prévu que la valeur de %~dp0 soit mise à jour pour refléter le nouveau répertoire.

Question :

Cependant, les utilisateurs ont observé des différences dans le comportement de %~dp0 lors de l'exécution d'un fichier batch via un programme C#. %~dp0 conserve sa valeur d'origine lorsqu'il est exécuté directement, mais change lorsqu'il est appelé depuis C#.

Analyse :

Cette différence est due à la façon dont %~0 (le nom du fichier batch non modifié) est géré lorsque le fichier batch est appelé avec des guillemets.

  • Exécution directe : Lorsque %~0 est cité, les guillemets sont supprimés et le chemin complet du fichier batch est utilisé pour déterminer %~dp0.
  • Exécution C# : Lorsque %~0 est cité en C#, la chaîne sans guillemets sera utilisée pour localiser le fichier batch. Cela peut entraîner des chemins relatifs, entraînant des valeurs %~dp0 inexactes.

Solution :

Afin de résoudre ce problème, deux méthodes sont recommandées :

À partir du code C# :

  • Évitez d'utiliser des guillemets lors de l'appel de fichiers batch : ProcessStartInfo.FileName = "mybatfile.bat";
  • Si des guillemets sont requis, veuillez spécifier le chemin complet du fichier batch pour garantir que %~dp0 reste exact.

À partir du fichier batch :

  • Utilisez un sous-programme pour récupérer de manière fiable le chemin du fichier batch actuel, quelle que soit la méthode d'exécution :
<code class="language-batch">@echo off
    setlocal enableextensions disabledelayedexpansion

    call :getCurrentBatch batch
    echo %batch%

    exit /b

:getCurrentBatch variableName
    set "%~1=%~f0"
    goto :eof</code>

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!

Déclaration:
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