ในไฟล์แบตช์เช่นเดียวกับในโปรแกรม C มาตรฐานอาร์กิวเมนต์ 0 มีเส้นทางไปยังสคริปต์ที่กำลังดำเนินการอยู่ในปัจจุบัน คุณสามารถใช้%~dp0
เพื่อรับเฉพาะส่วนของเส้นทางของอาร์กิวเมนต์ 0 (ซึ่งเป็นสคริปต์ปัจจุบัน) - เส้นทางนี้เป็นเส้นทางที่ผ่านการรับรองโดยสมบูรณ์เสมอ
คุณยังสามารถรับพา ธ ที่ผ่านการรับรองโดยสมบูรณ์ของอาร์กิวเมนต์แรกของคุณโดยใช้%~f1
แต่จะให้พา ธ ตามไดเรกทอรีการทำงานปัจจุบันซึ่งเห็นได้ชัดว่าไม่ใช่สิ่งที่คุณต้องการ
โดยส่วนตัวแล้วฉันมักจะใช้%~dp0%~1
สำนวนในไฟล์แบทช์ซึ่งตีความอาร์กิวเมนต์แรกที่สัมพันธ์กับเส้นทางของแบตช์ที่ดำเนินการ มันมีข้อบกพร่องแม้ว่ามันจะล้มเหลวอย่างน่าสังเวชถ้าอาร์กิวเมนต์แรกมีคุณสมบัติครบถ้วน
หากคุณต้องการสนับสนุนทั้งเส้นทางสัมพัทธ์และเส้นทางสัมบูรณ์คุณสามารถใช้ประโยชน์จากโซลูชันของFrédéricMé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 เป็น
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"
เอกสารสำหรับชุดตัวดัดแปลงที่ได้รับอนุญาตในอาร์กิวเมนต์ชุดสามารถดูได้ที่นี่:
https://docs.microsoft.com/en-us/windows-server/administrator/windows-commands/call
realpath
เพื่อการทำให้เป็นมาตรฐานของ path ที่มีประสิทธิภาพ