В пакетных файлах, как и в стандартных программах на C, аргумент 0 содержит путь к исполняемому в данный момент сценарию. Вы можете использовать %~dp0
, чтобы получить только часть пути 0-го аргумента (который является текущим сценарием) - этот путь всегда является полным путем.
Вы также можете получить полный путь к первому аргументу, используя %~f1
, но это дает путь в соответствии с текущим рабочим каталогом, что, очевидно, не то, что вам нужно.
Лично я часто использую идиому %~dp0%~1
в моем пакетном файле, которая интерпретирует первый аргумент относительно пути исполняемого пакета. Однако у него есть недостаток: он с треском проваливается, если первый аргумент полностью квалифицирован.
Если вам нужно поддерживать как относительные , так и абсолютные пути, вы можете использовать решение Фредерика Менеза : временно изменить текущий рабочий каталог.
Вот пример, который продемонстрирует каждый из этих методов:
@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 как
c: \ Users \ Public> \ 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"