% ~ Dp0 có nghĩa là gì và nó hoạt động như thế nào?


1024

Tôi thấy %~dp0rất hữu ích và tôi sử dụng nó rất nhiều để làm cho các tệp bó của tôi dễ mang theo hơn.

Nhưng bản thân nhãn hiệu có vẻ rất khó hiểu đối với tôi ... Đang ~làm gì vậy? Có dpnghĩa là ổ đĩa và đường dẫn? Có phải 0tham chiếu %0, đường dẫn đến tệp bó bao gồm tên tệp không?

Hay nó chỉ là một nhãn hiệu kỳ lạ?

Tôi cũng muốn biết nếu nó là một tính năng tài liệu, hoặc một cái gì đó dễ bị phản đối.



2
Bạn nói đúng, Hellen. Câu hỏi đó không xuất hiện khi tôi tìm kiếm% ~ dp0. Có lẽ bởi vì nó có% ~ d0 trên tiêu đề của nó thay vì% ~ dp0.
Sebastián Grignoli

9
SymbolHound là tuyệt vời để tiến hành tìm kiếm trên các ký tự khác ngoài chữ và số. Ví dụ, tìm kiếm%~dp0 . Thông thường tôi thấy rằng các lượt truy cập hàng đầu đề cập đến nội dung trên SO.
DavidRR

SymbolHound không hoạt động với tôi với biểu tượng tìm kiếm.com / ? Q =% 25~dp0 . Tuy nhiên, điều này đã hoạt động: google.com/search?q=%25~dp0 - chỉ cần nói ...
Kristopher

1
SymbolHound 2019: Không hoạt động và uMatrix chỉ ra rằng nó kết nối với các trang web của bên thứ ba như blockchain.info và paypalobjects.com.
Nils Lindemann

Câu trả lời:


811

Gọi điện thoại

for /?

trong dòng lệnh cung cấp trợ giúp về cú pháp này (cũng có thể được sử dụng bên ngoài FOR, đây chỉ là nơi có thể tìm thấy trợ giúp).

Ngoài ra, việc thay thế các tham chiếu biến FOR đã được tăng cường. Bây giờ bạn có thể sử dụng cú pháp tùy chọn sau:

%~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

Các sửa đổi có thể được kết hợp để có được kết quả gộp:

%~dpI       - expands %I to a drive letter and path only
%~nxI       - expands %I to a file name and extension only
%~fsI       - expands %I to a full path name with short names only
%~dp$PATH:I - searches the directories listed in the PATH
               environment variable for %I and expands to the
               drive letter and path of the first one found.
%~ftzaI     - expands %I to a DIR like output line

Trong các ví dụ trên,% I và PATH có thể được thay thế bằng các giá trị hợp lệ khác. Cú pháp% ~ được kết thúc bằng tên biến FOR hợp lệ. Chọn các tên biến chữ hoa như% I làm cho nó dễ đọc hơn và tránh nhầm lẫn với các sửa đổi, không phân biệt chữ hoa chữ thường.

Có nhiều chữ cái khác nhau mà bạn có thể sử dụng như f"tên đường dẫn đầy đủ", dcho ký tự ổ đĩa, pcho đường dẫn và chúng có thể được kết hợp. %~là sự khởi đầu cho mỗi chuỗi đó và một số Ibiểu thị nó hoạt động trên tham số %I(trong đó %0tên đầy đủ của tệp bó, giống như bạn giả định).


2
Tôi không biết về bất kỳ ai khác, nhưng tôi nhận được "Cách sử dụng toán tử đường dẫn sau trong thay thế tham số hàng loạt là không hợp lệ. Đối với các định dạng hợp lệ, gõ CALL /? Hoặc FOR /?. Cú pháp của lệnh không chính xác." khi sử dụng I. Tôi phải sử dụng 0thay vì I. Tôi không biết nếu tôi bỏ lỡ điều gì hay bất cứ điều gì, nhưng chỉ để mọi người biết.
huyền thoại

71
@BenHooper, Ilà một giữ chỗ cho chỉ số biến. 0= tệp gọi, 1= đối số # 1, 2= đối số # 2, v.v ...
Chris

9
Câu trả lời này là tốt. Và đầy đủ. Để dễ hiểu hơn một chút, tôi thích câu trả lời cho câu hỏi gần như trùng lặp này: stackoverflow.com/questions/112055/ợi
Frank Nocke

1
Câu trả lời này hơi khó hiểu vì những sự thay thế này có thể được sử dụng bên ngoài FOR.
David

348

(Đầu tiên, tôi muốn giới thiệu trang web tham khảo hữu ích này cho đợt: http://ss64.com/nt/ )

Sau đó, chỉ là một lời giải thích hữu ích khác: http://htipe.wordpress.com/2008/10/09/the-dp0-variable/

Biến% ~ dp0

Các% ~ dp0 (đó là một số không) biến khi tham chiếu trong một tập tin thực thi Windows sẽ mở rộng sang các d thư rive và p ATH của tập tin batch.

Các biến% 0-% 9 đề cập đến các tham số dòng lệnh của tệp bó. % 1-% 9 đề cập đến các đối số dòng lệnh sau tên tệp bó. % 0 đề cập đến chính tệp bó.

Nếu bạn theo dõi ký tự phần trăm (%) bằng ký tự dấu ngã (~), bạn có thể chèn (các) công cụ sửa đổi trước số tham số để thay đổi cách mở rộng biến. Công cụ sửa đổi d mở rộng thành ký tự ổ đĩa và công cụ sửa đổi p mở rộng theo đường dẫn của tham số.

Ví dụ: Giả sử bạn có một thư mục trên C: được gọi là bat_files và trong thư mục đó là một tệp có tên example.bat. Trong trường hợp này,% ~ dp0 (kết hợp bộ sửa đổi d và p) sẽ mở rộng thành C: \ bat_files.

Kiểm tra bài viết này của Microsoft để được giải thích đầy đủ.

Ngoài ra, kiểm tra chủ đề diễn đàn này .

Và một tài liệu tham khảo rõ ràng hơn từ đây :

  • %CmdCmdLine% sẽ trả về toàn bộ dòng lệnh khi được chuyển đến CMD.EXE

  • %* sẽ trả về phần còn lại của dòng lệnh bắt đầu từ đối số dòng lệnh đầu tiên (trong Windows NT 4,% * cũng bao gồm tất cả các khoảng trắng hàng đầu)

  • %~dn sẽ trả về ký tự ổ đĩa của% n (n có thể nằm trong khoảng từ 0 đến 9) nếu% n là đường dẫn hoặc tên tệp hợp lệ (không có UNC)

  • %~pn sẽ trả về thư mục của% n nếu% n là đường dẫn hoặc tên tệp hợp lệ (không có UNC)

  • %~nn sẽ chỉ trả lại tên tệp của% n nếu% n là tên tệp hợp lệ

  • %~xn sẽ chỉ trả về phần mở rộng tệp của% n nếu% n là tên tệp hợp lệ

  • %~fn sẽ trả về đường dẫn đủ điều kiện của% n nếu% n là tên tệp hoặc thư mục hợp lệ

THÊM 1

Chỉ cần tìm thấy một số tài liệu tham khảo tốt cho các nhà điều hành dấu ngã bí ẩn ~ .

Các %~chuỗi được gọi là phần trăm dấu ngã điều hành. Bạn có thể tìm thấy nó trong các tình huống như : %~0.

Các :~chuỗi được gọi là ruột dấu ngã điều hành. Bạn có thể tìm thấy nó như thế nào %SOME_VAR:~0,-1%.

THÊM 2 - 1:12 PM ngày 7/6/2018

%1-%9tham khảo dòng lệnh args. Nếu chúng không phải là giá trị đường dẫn hợp lệ, %~dp1- %~dp9tất cả sẽ mở rộng thành cùng giá trị như %~dp0. Nhưng nếu chúng các giá trị đường dẫn hợp lệ, chúng sẽ mở rộng thành giá trị trình điều khiển / đường dẫn của riêng chúng .

Ví dụ: (batch.bat)

@echo off
@echo ~dp0= %~dp0
@echo ~dp1= %~dp1
@echo ~dp2= %~dp2
@echo on

Chạy 1:

D:\Workbench>batch arg1 arg2

~dp0= D:\Workbench\
~dp1= D:\Workbench\
~dp2= D:\Workbench\

Chạy 2:

D:\Workbench>batch c:\123\a.exe e:\abc\b.exe

~dp0= D:\Workbench\
~dp1= c:\123\
~dp2= e:\abc\

Cũng tò mò về khái niệm này và tìm thấy sự làm rõ tốt ở đây. Cảm ơn Mingge. ^ _ ^
Eugene

1
đối với tôi, nó mở rộng thành c: \ bat_files \ (với dấu phân cách đường dẫn)
santa

Các liên kết đến bài viết của Microsoft và chủ đề diễn đàn không hoạt động nữa :(
wovano

151

Biến %0trong tập lệnh bó được đặt thành tên của tệp bó thực thi.

Các ~dpcú pháp đặc biệt giữa %0về cơ bản nói để mở rộng biến %0để hiển thị các ký tự ổ đĩa và đường dẫn, mang đến cho bạn sự thư mục hiện có chứa các tập tin thực thi!

Trợ giúp = Liên kết


@Andy, Có cách nào để kiểm tra %0trực tiếp trong cmd mà không lưu tệp .bat vào ổ cứng cục bộ không?
Pacerier

Liên kết bị hỏng và tôi không thể tìm thấy liên kết chính xác. Một chỉnh sửa đang chờ xử lý vẫn có liên kết bị hỏng.
George_E

44

% ~ dp0 mở rộng đến đường dẫn thư mục hiện tại của tệp bó đang chạy.

Để hiểu rõ hơn, hãy tạo một tệp bó trong một thư mục.

C: \ script \ test.bat

với nội dung:

@echo off
echo %~dp0

Khi bạn chạy nó từ dấu nhắc lệnh, bạn sẽ thấy kết quả này:

C: \ script \


41

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ó.

Ngoài ra, đối với #oneLinerLovers, như @Omni đã chỉ ra trong các nhận xét cd /d %~dp0sẽ thay đổi cả ổ đĩa và thư mục :)

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


23
cdcó một tham số tích hợp sẽ chuyển đổi cả ổ đĩa và thư mục:cd /d %~dp0
OmnipotentEntity

2
Bạn đúng và /dlập luận là hữu ích, nhưng nó xứng đáng được đăng dưới dạng câu trả lời thay thế của ứng viênkhông phải là một bình luận cho câu hỏi này. Tuy nhiên, cảm ơn bạn đã chỉ ra điều này, tôi không biết về nó :)
Marvin Thobejane

4
bạn cũng có thể sử dụng '' pushd% ~ dp0 '' để chuyển đổi ổ đĩa và thư mục
fmuecke

25

Ví dụ tuyệt vời từ launcher shell di động của Strawberry Perl:

set drive=%~dp0
set drivep=%drive%
if #%drive:~-1%# == #\# set drivep=%drive:~0,-1%

set PATH=%drivep%\perl\site\bin;%drivep%\perl\bin;%drivep%\c\bin;%PATH%

không chắc chắn những gì người tiêu cực đang làm ở đó, nhưng nó có tác dụng!


11
+1 rất hữu ích. Câu lệnh if kiểm tra nếu có dấu gạch chéo ngược và loại bỏ dấu gạch chéo ngược nếu cần. Số âm 1 trong điều kiện trích xuất ký tự cuối cùng và biểu thức trong câu lệnh set lấy chuỗi đường dẫn trừ đi ký tự cuối cùng (đó là dấu gạch chéo ngược).
Matt

1
âm 1 là trừ ký tự cuối cùng. Đọc chuỗi con biến
phuclv

12

Một ví dụ sẽ rất hay - đây là một ví dụ tầm thường

for %I in (*.*) do @echo %~xI

nó chỉ liệt kê các EXTENSION của mỗi tệp trong thư mục hiện tại

để biết thêm các kết hợp biến hữu ích (cũng được liệt kê trong phản hồi trước đó) từ dấu nhắc thực hiện của CMD: HELP FOR có chứa đoạn mã này

Các sửa đổi có thể được kết hợp để có được kết quả gộp:

%~dpI       - expands %I to a drive letter and path only
%~nxI       - expands %I to a file name and extension only
%~fsI       - expands %I to a full path name with short names only
%~dp$PATH:I - searches the directories listed in the PATH
               environment variable for %I and expands to the
               drive letter and path of the first one found.
%~ftzaI     - expands %I to a DIR like output line

tôi đã nhận được "~ xI thật bất ngờ vào lúc này." thử ví dụ - có phải vì tôi đang sử dụng Win 7?
chapter3

Đây là thông tin tốt, nhưng nó không giải quyết được bài gốc.
De Shan Baptiste
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.