% ~ D0 có nghĩa là gì trong tệp bó Windows?


353

Tôi đang xem một tệp bó xác định các biến sau:

set _SCRIPT_DRIVE=%~d0
set _SCRIPT_PATH=%~p0
  • Làm gì %~d0hoặc %~p0thực sự có nghĩa là gì?
  • Có một tập hợp các giá trị nổi tiếng cho những thứ như thư mục hiện tại, ổ đĩa, tham số cho một tập lệnh không?
  • Có bất kỳ phím tắt tương tự khác tôi có thể sử dụng?

Câu trả lời:


539

Các biến ma thuật %n chứa các đối số được sử dụng để gọi tệp: %0là đường dẫn đến chính tệp bat, %1là đối số đầu tiên sau, %2là đối số thứ hai, v.v.

Vì các đối số thường là các đường dẫn tệp, nên có một số cú pháp bổ sung để trích xuất các phần của đường dẫn. ~dlà ổ đĩa, ~plà đường dẫn (không có ổ đĩa), ~nlà tên tệp. Chúng có thể được kết hợp như vậy ~dplà ổ + đường dẫn.

%~dp0 do đó khá hữu ích trong một con dơi: đó là thư mục chứa tập tin bat thực thi.

Bạn cũng có thể nhận các loại thông tin meta khác về tệp: ~tlà dấu thời gian, ~zlà kích thước.

Nhìn vào đây để tham khảo cho tất cả các lệnh dòng lệnh. Các mã ma thuật được mô tả dưới đây cho .


15
lưu ý đến bản thân: echo %~dp0sẽ không hoạt động ở dòng lệnh, chỉ trong một tệp bó. Tât nhiên!
northben

2
Có sự khác biệt giữa %~d0%~d0%?
Geoffrey

2
@Pacerier:% 0 là đường dẫn đầy đủ bao gồm tên tệp của tập lệnh. % ~ dp0 là đường dẫn đến thư mục chứa tập lệnh nhưng không bao gồm tên tệp của tập lệnh.
JacquesB

4
note to self: echo %~pd0cho cùng một đầu ra như echo %~dp0(thay vì nghịch đảo như mong đợi). Ngoài ra, giá trị của %0khác nhau tùy thuộc vào việc bạn nhấp đúp vào tệp bó hay chạy nó từ cmd.
Pacerier

152

Họ được tăng cường thay thế biến. Chúng sửa đổi các biến% N được sử dụng trong các tệp bó. Khá hữu ích nếu bạn tham gia lập trình hàng loạt trong Windows.

%~I         - expands %I removing any surrounding quotes ("")
%~fI        - expands %I to a fully qualified path name
%~dI        - expands %I to a drive letter only
%~pI        - expands %I to a path only
%~nI        - expands %I to a file name only
%~xI        - expands %I to a file extension only
%~sI        - expanded path contains short names only
%~aI        - expands %I to file attributes of file
%~tI        - expands %I to date/time of file
%~zI        - expands %I to size of file
%~$PATH:I   - searches the directories listed in the PATH
               environment variable and expands %I to the
               fully qualified name of the first one found.
               If the environment variable name is not
               defined or the file is not found by the
               search, then this modifier expands to the
               empty string

Bạn có thể tìm thấy ở trên bằng cách chạy FOR /?.


48

Có, có những phím tắt khác mà bạn có thể sử dụng được đưa ra dưới đây. Trong lệnh của bạn, ~ d0 có nghĩa là ký tự ổ đĩa của đối số 0.

~ expands the given variable
d gets the drive letter only
0 is the argument you are referencing

Vì đối số 0 là đường dẫn kịch bản, nó lấy ký tự ổ đĩa của đường dẫn cho bạn. Bạn cũng có thể sử dụng các phím tắt sau.

%~1         - expands %1 removing any surrounding quotes (")
%~f1        - expands %1 to a fully qualified path name
%~d1        - expands %1 to a drive letter only
%~p1        - expands %1 to a path only
%~n1        - expands %1 to a file name only
%~x1        - expands %1 to a file extension only
%~s1        - expanded path contains short names only
%~a1        - expands %1 to file attributes
%~t1        - expands %1 to date/time of file
%~z1        - expands %1 to size of file
%~$PATH:1   - searches the directories listed in the PATH
               environment variable and expands %1 to the fully
               qualified name of the first one found.  If the
               environment variable name is not defined or the
               file is not found by the search, then this
               modifier expands to the empty string    

%~dp1       - expands %1 to a drive letter and path only
%~nx1       - expands %1 to a file name and extension only
%~dp$PATH:1 - searches the directories listed in the PATH
               environment variable for %1 and expands to the
               drive letter and path of the first one found.
%~ftza1     - expands %1 to a DIR like output line

Điều này cũng có thể được tìm thấy trực tiếp trong dấu nhắc lệnh khi bạn chạy CALL /? hoặc là /?



9

Một mẹo khác có thể giúp ích rất nhiều là đặt thư mục hiện tại sang một ổ đĩa khác%~d0 , trước tiên bạn sẽ phải sử dụng cd %~dp0. Điều này sẽ thay đổi thư mục vào ổ đĩa của tệp bó, sau đó thay đổi thư mục của nó.

Đối với #oneLinerLovers, cd /d %~dp0sẽ thay đổi cả ổ đĩa và thư mục :)

Hy vọng điều này sẽ giúp được ai đó.


7
một tùy chọn khác là pushd %~dp0, không có vấn đề gì khi thay đổi ổ đĩa hiện tại và cung cấp cho bạn phần thưởng bổ sung để có thể popdquay lại ổ đĩa / đường dẫn ban đầu sau đó.
bcrist

7

%~d0cung cấp cho bạn ký tự ổ đĩa của đối số 0 (tên tập lệnh), %~p0đường dẫn.


6

Một số vấn đề cần chú ý:

Nếu bạn bấm đúp vào tệp bó %0sẽ được bao quanh bởi dấu ngoặc kép. Ví dụ: nếu bạn lưu tệp này dưới dạng c:\test.bat:

@echo %0
@pause

Bấm đúp vào nó sẽ mở ra một dấu nhắc lệnh mới với đầu ra:

"C:\test.bat"

Nhưng nếu trước tiên bạn mở một dấu nhắc lệnh và gọi nó trực tiếp từ dấu nhắc lệnh đó, %0sẽ tham chiếu đến bất cứ điều gì bạn đã nhập . Nếu bạn nhập test.batEnter, đầu ra của %0sẽ không có dấu ngoặc kép vì bạn đã gõ không có dấu ngoặc kép:

c:\>test.bat
test.bat

Nếu bạn nhập testEnter, đầu ra của %0sẽ không có phần mở rộng, vì bạn đã gõ không có phần mở rộng:

c:\>test
test

Tương tự cho tEsTEnter:

c:\>tEsT
tEsT

Nếu bạn nhập "test"Enter, đầu ra của %0sẽ có dấu ngoặc kép (vì bạn đã nhập chúng) nhưng không có phần mở rộng:

c:\>"test"
"test"

Cuối cùng, nếu bạn nhập "C:\test.bat", đầu ra sẽ chính xác như thể bạn đã nhấp đúp vào nó:

c:\>"C:\test.bat"
"C:\test.bat"

Lưu ý rằng đây không phải là tất cả các giá trị %0có thể có thể là do bạn có thể gọi tập lệnh từ các thư mục khác:

c:\some_folder>/../teST.bAt
/../teST.bAt

Tất cả các ví dụ hiển thị ở trên cũng sẽ ảnh hưởng %~0, bởi vì đầu ra của %~0chỉ đơn giản là đầu ra của %0 dấu ngoặc kép (nếu có).


3

Mã này giải thích việc sử dụng ký tự ~ tilda, đó là điều khó hiểu nhất đối với tôi. Khi tôi hiểu điều này, nó làm cho mọi thứ dễ hiểu hơn nhiều:

@ECHO off
SET "PATH=%~dp0;%PATH%"
ECHO %PATH%
ECHO.
CALL :testargs "these are days" "when the brave endure"
GOTO :pauseit
:testargs
SET ARGS=%~1;%~2;%1;%2
ECHO %ARGS%
ECHO.
exit /B 0
:pauseit
pause

1

Nó hiển thị vị trí hiện tại của tệp hoặc thư mục mà bạn hiện đang ở. Ví dụ; nếu tệp bó của bạn nằm trong thư mục máy tính để bàn, thì "% ~ dp0" sẽ hiển thị thư mục máy tính để bàn. nếu bạn muốn nó hiển thị thư mục hiện tại với tên tệp hiện tại, bạn có thể nhập "% ~ dp0% ~ n0% ~ x0".


"% ~ dpnx0" sẽ tốt hơn
FrinkTheBrave
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.