Dalam file batch, seperti dalam program C standar, argumen 0 berisi path ke skrip yang sedang dieksekusi. Anda bisa menggunakan %~dp0
untuk mendapatkan hanya bagian jalur dari argumen ke-0 (yang merupakan skrip saat ini) - jalur ini selalu merupakan jalur yang sepenuhnya memenuhi syarat.
Anda juga bisa mendapatkan lintasan yang memenuhi syarat penuh dari argumen pertama Anda dengan menggunakan %~f1
, tetapi ini memberikan lintasan sesuai dengan direktori kerja saat ini, yang jelas bukan yang Anda inginkan.
Secara pribadi, saya sering menggunakan %~dp0%~1
idiom dalam file batch saya, yang mengartikan argumen pertama relatif terhadap path dari batch yang dieksekusi. Itu memang memiliki kekurangan: gagal total jika argumen pertama sepenuhnya memenuhi syarat.
Jika Anda perlu mendukung jalur relatif dan absolut, Anda dapat menggunakan solusi Frédéric Ménez : untuk sementara mengubah direktori kerja saat ini.
Berikut adalah contoh yang akan menunjukkan masing-masing teknik ini:
@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
Jika Anda menyimpan ini sebagai c: \ temp \ example.bat dan jalankan dari c: \ Users \ Public as
c: \ Users \ Public> \ temp \ example.bat .. \ windows
... Anda akan mengamati output berikut:
%~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"
dokumentasi untuk set pengubah yang diizinkan pada argumen batch dapat ditemukan di sini:
https://docs.microsoft.com/en-us/windows-server/administration/windows-commands/call
realpath
untuk normalisasi jalur yang kuat.