У пакетних файлах, як у стандартних програмах на C, аргумент 0 містить шлях до поточного виконуваного сценарію. Ви можете використовувати %~dp0
лише частину шляху 0-го аргументу (який є поточним сценарієм) - цей шлях завжди є повністю кваліфікованим шляхом.
Ви також можете отримати повністю кваліфікований шлях вашого першого аргументу, використовуючи %~f1
, але це дає шлях відповідно до поточного робочого каталогу, який, очевидно, не є тим, що ви хочете.
Особисто я часто використовую %~dp0%~1
ідіому у своєму пакетному файлі, який інтерпретує перший аргумент відносно шляху виконуваної партії. Однак у нього є недолік: він збиває з ладу, якщо перший аргумент є повністю кваліфікованим.
Якщо вам потрібно підтримувати як відносні, так і абсолютні шляхи, ви можете скористатися рішенням Frédéric Ménez : тимчасово змінити поточний робочий каталог.
Ось приклад, який демонструє кожну з цих методик:
@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
Якщо ви збережете це як c: \ temp \ example.bat і запустіть його з c: \ Users \ Public as
c: \ Користувачі \ Загальні> \ temp \ example.bat .. \ windows
... ви будете спостерігати такий результат:
%~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"
документацію для набору модифікаторів, дозволених у пакетному аргументі, можна знайти тут:
https://docs.microsoft.com/en-us/windows-server/administration/windows-commands/call
realpath
для надійної нормалізації шляху.