In Batch-Dateien enthält Argument 0 wie in Standard-C-Programmen den Pfad zum aktuell ausgeführten Skript. Sie können %~dp0
nur den Pfadabschnitt des 0. Arguments abrufen (dies ist das aktuelle Skript). Dieser Pfad ist immer ein vollständig qualifizierter Pfad.
Sie können auch den vollständig qualifizierten Pfad Ihres ersten Arguments mithilfe von ermitteln %~f1
. Dies gibt jedoch einen Pfad entsprechend dem aktuellen Arbeitsverzeichnis an, der offensichtlich nicht Ihren Wünschen entspricht.
Persönlich verwende ich häufig das %~dp0%~1
Idiom in meiner Batch-Datei, das das erste Argument relativ zum Pfad des ausführenden Batches interpretiert. Es hat jedoch ein Manko: Es scheitert kläglich, wenn das erste Argument voll qualifiziert ist.
Wenn Sie sowohl relative als auch absolute Pfade unterstützen müssen, können Sie die Lösung von Frédéric Ménez verwenden : Ändern Sie vorübergehend das aktuelle Arbeitsverzeichnis.
Hier ist ein Beispiel, das jede dieser Techniken demonstriert:
@echo off
echo %%~dp0 is "%~dp0"
echo %%0 is "%0"
echo %%~dpnx0 is "%~dpnx0"
echo %%~f1 is "%~f1"
echo %%~dp0%%~1 is "%~dp0%~1"
rem Temporarily change the current working directory, to retrieve a full path
rem to the first parameter
pushd .
cd %~dp0
echo batch-relative %%~f1 is "%~f1"
popd
Wenn Sie dies als c: \ temp \ example.bat speichern und unter c: \ Users \ Public as ausführen
c: \ Users \ Public> \ temp \ example.bat .. \ windows
... Sie werden die folgende Ausgabe beobachten:
%~dp0 is "C:\temp\"
%0 is "\temp\example.bat"
%~dpnx0 is "C:\temp\example.bat"
%~f1 is "C:\Users\windows"
%~dp0%~1 is "C:\temp\..\windows"
batch-relative %~f1 is "C:\Windows"
Die Dokumentation zu den Modifikatoren, die für ein Batch-Argument zulässig sind, finden Sie hier:
https://docs.microsoft.com/en-us/windows-server/administration/windows-commands/call
realpath
für eine robuste Pfadnormalisierung.