Heim >Backend-Entwicklung >C++ >Warum verhält sich der %~dp0-Batchdateipfad beim Aufruf aus C# anders als beim direkten Aufruf?
Verstehen der Diskrepanz in Batch-Dateipfadverweisen (%~dp0)
Das Verhalten von %~dp0
in Batchdateien kann je nachdem, wie die Batchdatei ausgeführt wird, variieren, insbesondere beim Vergleich der direkten Ausführung mit der Ausführung aus einem C#-Programm. Dieser Unterschied ergibt sich aus der Art und Weise, wie cmd.exe
mit der Variablen %~0
und ihren Modifikatoren umgeht.
Das Problem:
Stellen Sie sich eine Batchdatei mit diesen Zeilen vor:
<code class="language-batch">echo %~dp0 cd Arvind echo %~dp0</code>
Bei direkter Ausführung hat das Ändern des Verzeichnisses in „Arvind“ keinen Einfluss auf die Ausgabe von %~dp0
. Wenn jedoch dieselbe Batchdatei von einem C#-Programm aufgerufen wird, spiegelt die zweite echo %~dp0
das neue Verzeichnis („Arvind“) wider.
Die Grundursache:
Das Kernproblem liegt in der Interpretation von cmd.exe
durch %~0
. Die Variable %~0
greift zusammen mit Modifikatoren wie ~d
(Laufwerksbuchstabe) und ~p
(Pfad) auf Informationen aus der internen Darstellung der aktuell ausgeführten Batchdatei zu.
Der entscheidende Unterschied besteht darin, wie sich das Zitieren auf diese interne Referenz auswirkt. Wenn %~0
nicht in Anführungszeichen steht, verweist die interne Referenz korrekt auf den vollständigen Pfad der Batchdatei. Wenn der Aufruf der Batchdatei jedoch in Anführungszeichen gesetzt wird (was bei C#-Interaktionen üblich ist), entfernt cmd.exe
die Anführungszeichen, was möglicherweise zu einer relativen Pfadinterpretation anstelle des absoluten Pfads führt. Diese relative Pfadinterpretation ändert sich dann basierend auf dem aktuellen Arbeitsverzeichnis.
Lösungen:
Für C#-Ausführung:
cmd /c batchfile.cmd
anstelle von "cmd /c "batchfile.cmd"
.cmd.exe
unabhängig vom Arbeitsverzeichnis den richtigen absoluten Pfad hat.Für die Batch-Dateiausführung:
<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>
Diese Unterroutine verwendet %~f0
(das immer den vollständigen Pfad bereitstellt), um den Pfad in der angegebenen Variablen (myBatchPath
in diesem Beispiel) zu speichern. Die Variable bleibt dann auch nach einem Verzeichniswechsel konsistent.
Das obige ist der detaillierte Inhalt vonWarum verhält sich der %~dp0-Batchdateipfad beim Aufruf aus C# anders als beim direkten Aufruf?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!