% ~ dp0 หมายถึงอะไรและทำงานอย่างไร


1023

ฉันพบว่า%~dp0มีประโยชน์มากและฉันใช้มันเป็นจำนวนมากเพื่อทำให้ไฟล์แบตช์ของฉันพกพาได้มากขึ้น

แต่ฉลากตัวเองดูเหมือนจะเป็นความลับสำหรับฉัน ... กำลัง~ทำอะไรอยู่? ไม่dpไดรฟ์เฉลี่ยและเส้นทาง? การ0อ้างอิงถึง%0พา ธ ไปยังไฟล์แบตช์ที่มีชื่อไฟล์หรือไม่

หรือมันเป็นเพียงฉลากแปลก ๆ ?

ฉันต้องการทราบด้วยหรือไม่ว่าเป็นคุณลักษณะที่บันทึกไว้หรือมีแนวโน้มที่จะถูกเลิกใช้งาน


13
มีความเป็นไปได้ที่ซ้ำกันของ% ~ d0 หมายถึงอะไรในไฟล์แบตช์ของ Windows
เฮเลน

2
คุณพูดถูกแล้วเฮเลน คำถามนั้นไม่ปรากฏขึ้นเมื่อฉันค้นหา% ~ dp0 อาจเป็นเพราะมี% ~ d0 ในชื่อแทนที่จะเป็น% ~ dp0
Sebastián Grignoli

9
SymbolHoundเหมาะอย่างยิ่งสำหรับการค้นหาอื่น ๆ นอกเหนือจากตัวอักษรและตัวเลข ยกตัวอย่างเช่นค้นหา %~dp0ฉันมักจะพบว่าความนิยมสูงสุดอ้างถึงเนื้อหาใน SO
DavidRR

SymbolHound ไม่ได้ทำงานให้ฉันด้วยการค้นหาsymbolhound.com/?q=%25~dp0 อย่างไรก็ตามสิ่งนี้ใช้งานได้: google.com/search?q=%25~dp0 - เพียงแค่ว่า '...
Kristopher

1
SymbolHound 2019: ไม่ทำงานและ uMatrix ระบุว่าเชื่อมต่อกับเว็บไซต์บุคคลที่สามเช่น blockchain.info และ paypalobjects.com
Nils Lindemann

คำตอบ:


810

การเรียกร้อง

for /?

ในบรรทัดคำสั่งให้ความช่วยเหลือเกี่ยวกับไวยากรณ์นี้ (ซึ่งสามารถใช้นอก FOR ได้เช่นกันนี่เป็นเพียงสถานที่ที่สามารถพบความช่วยเหลือได้)

นอกจากนี้การทดแทนการอ้างอิงตัวแปรได้รับการปรับปรุง ตอนนี้คุณสามารถใช้ไวยากรณ์เพิ่มเติมดังต่อไปนี้:

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

ตัวดัดแปลงสามารถรวมกันเพื่อให้ได้ผลลัพธ์แบบผสม:

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

ในตัวอย่างข้างต้น% I และ PATH สามารถถูกแทนที่ด้วยค่าที่ถูกต้องอื่น ๆ ไวยากรณ์% ~ ถูกยกเลิกโดยชื่อตัวแปรที่ถูกต้อง การเลือกชื่อตัวแปรตัวพิมพ์ใหญ่เช่น% I ทำให้อ่านง่ายขึ้นและหลีกเลี่ยงความสับสนกับโมดิฟายเออร์ซึ่งไม่คำนึงถึงขนาดตัวพิมพ์

มีตัวอักษรต่าง ๆ ที่คุณสามารถใช้fสำหรับ "ชื่อพา ธ แบบเต็ม" dสำหรับอักษรชื่อไดรฟ์pสำหรับเส้นทางและสามารถรวมกันได้ %~เป็นจุดเริ่มต้นสำหรับแต่ละลำดับเหล่านั้นและตัวเลขIแสดงว่าทำงานบนพารามิเตอร์%I(ซึ่ง%0เป็นชื่อที่สมบูรณ์ของแบตช์ไฟล์เช่นเดียวกับที่คุณสมมติ)


2
ฉันไม่รู้เกี่ยวกับคนอื่น แต่ฉันได้รับ "การใช้งานตัวดำเนินการเส้นทางต่อไปนี้ในการทดแทนชุดพารามิเตอร์ไม่ถูกต้องสำหรับรูปแบบที่ถูกต้องพิมพ์ CALL /? หรือ FOR /? ไวยากรณ์ของคำสั่งไม่ถูกต้อง" Iเมื่อใช้ ฉันต้องใช้แทน0 Iฉันไม่รู้ว่าฉันพลาดอะไรไปหรือเปล่า แต่บอกให้คนอื่นรู้
mythofechelon

71
@BenHooper Iเป็นตัวยึดสำหรับดัชนีตัวแปร 0= ไฟล์โทร1= อาร์กิวเมนต์ # 1, 2= อาร์กิวเมนต์ # 2 ฯลฯ ...
Chris

9
คำตอบนี้ดี และละเอียดถี่ถ้วน เพื่อความกระชับมากกว่านี้ฉันชอบคำตอบสำหรับคำถามที่ใกล้เคียงกันนี้: stackoverflow.com/questions/112055/…
Frank Nocke

1
คำตอบนี้ค่อนข้างสับสนเนื่องจากการทดแทนเหล่านี้สามารถใช้นอก FOR
David

346

(ก่อนอื่นฉันขอแนะนำไซต์อ้างอิงที่มีประโยชน์นี้เป็นชุด: http://ss64.com/nt/ )

ถ้าอย่างนั้นก็มีอีกคำอธิบายที่เป็นประโยชน์: http://htipe.wordpress.com/2008/10/09/the-dp0-variable/

ตัวแปร% ~ dp0

ของ% ~ dp0 (ที่เป็นศูนย์) ตัวแปรเมื่ออ้างอิงภายในแฟ้มชุด Windows จะขยายไปยังdตัวอักษร Rive และพี ATH ของไฟล์แบทช์ที่

ตัวแปร% 0-% 9 อ้างถึงพารามิเตอร์บรรทัดคำสั่งของไฟล์แบตช์ % 1-% 9 อ้างถึงอาร์กิวเมนต์บรรทัดคำสั่งหลังชื่อแบตช์ไฟล์ % 0 อ้างถึงไฟล์แบตช์เอง

หากคุณตามตัวอักษรเปอร์เซนต์ (%) ด้วยตัวอักขระ tilde (~) คุณสามารถแทรกตัวแก้ไข (s) ก่อนหมายเลขพารามิเตอร์เพื่อเปลี่ยนวิธีที่ตัวแปรถูกขยาย ตัวปรับ d ขยายไปถึงตัวอักษรชื่อไดรฟ์และตัวดัดแปลง p ขยายไปยังพา ธ ของพารามิเตอร์

ตัวอย่าง: สมมติว่าคุณมีไดเรกทอรีบน C: ชื่อ bat_files และในไดเรกทอรีนั้นเป็นไฟล์ชื่อ example.bat ในกรณีนี้% ~ dp0 (การรวมตัวดัดแปลง d และ p) จะขยายเป็น C: \ bat_files

ลองอ่านบทความ Microsoft นี้สำหรับคำอธิบายโดยละเอียด

นอกจากนี้ตรวจสอบกระทู้ฟอรั่มนี้

และการอ้างอิงที่ชัดเจนยิ่งขึ้นจากที่นี่ :

  • %CmdCmdLine% จะส่งคืนบรรทัดคำสั่งทั้งหมดตามที่ส่งไปยัง CMD.EXE

  • %* จะส่งคืนส่วนที่เหลือของบรรทัดคำสั่งเริ่มต้นที่อาร์กิวเมนต์บรรทัดคำสั่งแรก (ใน Windows NT 4,% * ยังมีช่องว่างนำหน้าทั้งหมด)

  • %~dn จะส่งคืนอักษรระบุไดรฟ์ของ% n (n สามารถอยู่ในช่วงตั้งแต่ 0 ถึง 9) หาก% n เป็นพา ธ หรือชื่อไฟล์ที่ถูกต้อง (ไม่มี UNC)

  • %~pn จะส่งคืนไดเรกทอรีของ% n ถ้า% n เป็นพา ธ หรือชื่อไฟล์ที่ถูกต้อง (ไม่มี UNC)

  • %~nn จะส่งคืนชื่อไฟล์เพียง% n ​​ถ้า% n เป็นชื่อไฟล์ที่ถูกต้อง

  • %~xn จะส่งคืนนามสกุลไฟล์เพียง% n ​​ถ้า% n เป็นชื่อไฟล์ที่ถูกต้อง

  • %~fn จะส่งคืนพา ธ แบบเต็มของ% n หาก% n เป็นชื่อไฟล์หรือไดเรกทอรีที่ถูกต้อง

เพิ่ม 1

เพิ่งพบการอ้างอิงที่ดีสำหรับผู้ประกอบการตัวหนอนลึกลับ ~

%~สตริงเรียกว่าร้อยละหนอนประกอบการ %~0คุณสามารถค้นหาได้ในสถานการณ์เช่น:

:~สตริงเรียกว่าลำไส้ใหญ่หนอนประกอบการ %SOME_VAR:~0,-1%คุณสามารถค้นหาได้ชอบ

เพิ่ม 2 - 1:12 PM 7/6/2018

%1-%9อ้างถึง args ของบรรทัดคำสั่ง หากพวกเขาไม่ได้ค่าเส้นทางที่ถูกต้อง%~dp1- ทั้งหมดจะขยายไปยังค่าเช่นเดียวกับ%~dp9 %~dp0แต่หากพวกเขาเป็นค่าเส้นทางที่ถูกต้องพวกเขาจะขยายไปยังค่าไดรเวอร์ / เส้นทางของตัวเอง

ตัวอย่างเช่น: (batch.bat)

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

เรียกใช้ 1:

D:\Workbench>batch arg1 arg2

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

เรียกใช้ 2:

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

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

ยังอยากรู้เกี่ยวกับแนวคิดนี้และพบคำอธิบายที่ดีที่นี่ ขอบคุณ Mingge ^ _ ^
Eugene

1
สำหรับฉันมันจะขยายไปยัง c: \ bat_files \ (พร้อมตัวคั่นเส้นทางที่ต่อท้าย)
santa

ลิงก์ไปยังบทความของ Microsoft และเธรดฟอรัมไม่ทำงานอีกต่อไป :(
wovano

150

ตัวแปร%0ในแบตช์สคริปต์ถูกตั้งค่าเป็นชื่อของไฟล์แบตช์ที่ดำเนินการ

~dpไวยากรณ์พิเศษระหว่าง%และ0โดยทั่วไปว่าจะขยายตัวแปร%0ที่จะแสดงอักษรไดรฟ์และเส้นทางที่ช่วยให้คุณไดเรกทอรีปัจจุบันที่มีแฟ้มชุด!

ช่วยเหลือ = ลิงค์


@Andy มีวิธีทดสอบ%0โดยตรงใน cmd โดยไม่บันทึกไฟล์. bat ลงใน harddrive ในเครื่องหรือไม่?
Pacerier

ลิงก์ใช้งานไม่ได้และฉันไม่พบลิงค์ที่ถูกต้อง การแก้ไขที่ค้างอยู่ยังคงมีลิงค์เสีย
George_E

44

% ~ dp0 ขยายไปยังเส้นทางไดเรกทอรีปัจจุบันของไฟล์แบตช์ที่กำลังทำงาน

เพื่อให้เข้าใจชัดเจนขึ้นให้สร้างแบทช์ไฟล์ในไดเรกทอรี

C: \ สคริปต์ \ test.bat

มีเนื้อหา:

@echo off
echo %~dp0

เมื่อคุณเรียกใช้จากพรอมต์คำสั่งคุณจะเห็นผลลัพธ์นี้:

C: \ สคริปต์ \


40

เคล็ดลับที่จะช่วยได้มากก็คือว่าการตั้งค่าไดเรกทอรีปัจจุบันไปยังไดรฟ์ที่แตกต่างกันอย่างใดอย่างหนึ่งจะต้องใช้ก่อนแล้ว%~d0 cd %~dp0การดำเนินการนี้จะเปลี่ยนไดเรกทอรีเป็นไดรฟ์ของแบตช์ไฟล์จากนั้นเปลี่ยนเป็นโฟลเดอร์

อีกทางเลือกหนึ่งสำหรับ #oneLinerLovers ตามที่ @Omni ชี้ให้เห็นในความคิดเห็นcd /d %~dp0จะเปลี่ยนทั้งไดรฟ์และไดเรกทอรี :)

หวังว่านี่จะช่วยใครซักคน


22
cdมีพารามิเตอร์ในตัวที่จะเปลี่ยนทั้งไดรฟ์และโฟลเดอร์:cd /d %~dp0
OmnipotentEntity

2
คุณพูดถูกและ/dข้อโต้แย้งนั้นมีประโยชน์ แต่ก็สมควรที่จะโพสต์เป็นคำตอบอื่น ๆ ของผู้สมัครและไม่ใช่ความเห็นของคนนี้ ขอบคุณสำหรับการชี้ออกมานี้ แต่ผมไม่ทราบว่าเกี่ยวกับเรื่องนี้ :)
มาร์วิน Thobejane

4
คุณสามารถใช้ '' pushd% ~ dp0 '' เพื่อสลับไดรฟ์และโฟลเดอร์
fmuecke

25

ตัวอย่างที่ยอดเยี่ยมจากตัวเปิดใช้เชลล์แบบพกพาของ Perl 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%

ไม่แน่ใจว่าสิ่งที่ลบ 1 กำลังทำอยู่ที่นั่น แต่ทำงานได้ดี!


11
+1 มีประโยชน์มาก คำสั่ง if ตรวจสอบว่ามีเครื่องหมายแบ็กสแลชอยู่หรือไม่และลบแบ็กสแลชหากจำเป็น ค่าลบ 1 ในเงื่อนไขจะแยกอักขระตัวสุดท้ายและนิพจน์ในชุดคำสั่งจะใช้สตริงพา ธ ลบอักขระตัวสุดท้าย (ซึ่งคือแบ็กสแลช)
Matt

1
ลบ 1 คือลบอักขระตัวสุดท้าย อ่านสตริงย่อยตัวแปร
phuclv

12

ตัวอย่างจะดี - นี่เป็นเรื่องเล็กน้อย

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

มันจะแสดงเฉพาะส่วนขยายของแต่ละไฟล์ในโฟลเดอร์ปัจจุบัน

สำหรับชุดค่าผสมที่มีประโยชน์มากขึ้น (แสดงอยู่ในการตอบกลับก่อนหน้า) จากการดำเนินการพรอมต์ CMD: HELP FOR ซึ่งมีตัวอย่างนี้

ตัวดัดแปลงสามารถรวมกันเพื่อให้ได้ผลลัพธ์แบบผสม:

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

ฉันได้รับ "~ xI ไม่คาดคิดในขณะนี้" ลองตัวอย่าง - เป็นเพราะฉันใช้ Win 7 หรือไม่
Chapter3

นี่เป็นข้อมูลที่ดี แต่ไม่สามารถระบุที่อยู่เดิมได้
De Shan Baptiste
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.