Trong các tệp bó, như trong các chương trình C tiêu chuẩn, đối số 0 chứa đường dẫn đến tập lệnh hiện đang thực thi. Bạn có thể sử dụng %~dp0
để chỉ lấy phần đường dẫn của đối số 0 (là tập lệnh hiện tại) - đường dẫn này luôn là đường dẫn đủ điều kiện.
Bạn cũng có thể có được đường dẫn đủ điều kiện của đối số đầu tiên của mình bằng cách sử dụng %~f1
, nhưng điều này đưa ra một đường dẫn theo thư mục làm việc hiện tại, đây rõ ràng không phải là điều bạn muốn.
Cá nhân, tôi thường sử dụng %~dp0%~1
thành ngữ trong tệp bó của mình, nó diễn giải đối số đầu tiên liên quan đến đường dẫn của lô thực thi. Mặc dù vậy, nó có một thiếu sót: nó thất bại thảm hại nếu đối số đầu tiên đủ điều kiện.
Nếu bạn cần hỗ trợ cả hai đường dẫn tương đối và tuyệt đối, bạn có thể sử dụng giải pháp của Frédéric Ménez : tạm thời thay đổi thư mục làm việc hiện tại.
Đây là một ví dụ sẽ chứng minh từng kỹ thuật sau:
@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
Nếu bạn lưu cái này dưới dạng c: \ temp \ example.bat và chạy nó từ c: \ Users \ Public dưới dạng
c: \ Users \ Public> \ temp \ example.bat .. \ windows
... bạn sẽ quan sát đầu ra sau:
%~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"
tài liệu cho bộ sửa đổi được phép trên một đối số bó có thể được tìm thấy ở đây:
https://docs.microsoft.com/en-us/windows-server/adftime/windows-commands/call
realpath
để chuẩn hóa đường dẫn mạnh mẽ.