วิธีรับพา ธ ของสคริปต์ชุดงานใน Windows


329

ฉันรู้ว่า%0มีเส้นทางแบบเต็มของสคริปต์ชุดเช่นc:\path\to\my\file\abc.bat

ฉันจะpathเท่ากับc:\path\to\my\file

ฉันจะบรรลุสิ่งนั้นได้อย่างไร




1
BTW:% 0 ไม่มีเส้นทางแบบเต็มหากค้างคาวถูกเรียกด้วยบรรทัดคำสั่งสัมพัทธ์ ดังนั้น "% ~ dpf0" จึงน่าเชื่อถือมากกว่าสำหรับกรณีนี้
eckes

คำตอบ:


562

%~dp0จะเป็นไดเรกทอรี นี่คือเอกสารบางส่วนของตัวดัดแปลงเส้นทางทั้งหมด สิ่งที่สนุก :-)

หากต้องการลบเครื่องหมายแบ็กสแลชสุดท้ายคุณสามารถใช้:n,mไวยากรณ์สตริงย่อยดังนี้:

SET mypath=%~dp0
echo %mypath:~0,-1%

ฉันไม่เชื่อว่ามีวิธีรวม%0ไวยากรณ์กับ:~n,mไวยากรณ์ แต่น่าเสียดายที่


7
ยอดเยี่ยม ... ฉันใช้ไปแล้ว%~0\..- รู้ว่าต้องมีวิธีที่ดีกว่า! นอกจากนี้คุณอาจต้องการใส่%~dp0เครื่องหมายอัญประกาศคู่ ( "") ในกรณีที่มีช่องว่างในชื่อไดเรกทอรี ฯลฯ
Cameron

1
เยี่ยมมาก! แต่%~dp0มี `` ในตอนท้าย คุณมีความคิดวิธีลบออกหรือไม่
Misha Moroshko

1
@Misha: ฉันคิดว่าคุณหมายถึงวิธีลบ '\' ในตอนท้าย ฉันได้อัปเดตคำตอบพร้อมรายละเอียดแล้ว
Dean Harding

2
ตัวอย่างในคำตอบทำงานได้ดีโดยไม่ใส่เครื่องหมายอัญประกาศแม้ว่าจะมีช่องว่างในเส้นทาง (เช่นใช้SET msg=hello worldงานได้ดี) อย่างไรก็ตามเมื่อใช้% mypath% ที่อื่นคุณต้องระวังในการใช้เครื่องหมายคำพูดแม้ว่าจะไม่จำเป็นสำหรับcdทั้งสองก็ตาม
Martin Pain

2
ลิงค์นั้นคือตอนนี้ 404
StingyJack

12

คุณสามารถใช้สคริปต์ต่อไปนี้เพื่อรับเส้นทางโดยไม่ต้องต่อท้าย "\"

for %%i in ("%~dp0.") do SET "mypath=%%~fi"

สิ่งนี้จะไม่ลบชื่อไฟล์ออกจากเส้นทางแม้ว่า (เช่น abc.txt ในตัวอย่างของ OP)
dcp

4
@dcp Er มันทำ แต่
Kyle Strand

@ Kyle Strand - ใช่ฉันเพิ่งลองอีกครั้งและตอนนี้มันทำงานได้ดี ฉันไม่แน่ใจว่าเกิดอะไรขึ้นเมื่อฉันลองใช้ครั้งแรกบางทีฉันอาจทำผิดพลาดในสคริปต์ ขออภัยในความสับสนและขอบคุณที่ชี้ให้เห็น
dcp

11

%~dp0อาจเป็นเส้นทางญาติ หากต้องการแปลงเป็นเส้นทางแบบเต็มให้ลองดังนี้:

pushd %~dp0
set script_dir=%CD%
popd

6
ตกลงดังนั้นทำไมไม่ใช้เพียง%~dp0โดยตรง
jpaugh

5
รุ่นที่แย่กว่าของคำตอบที่ยอมรับโพสต์ 5 ปีต่อมา ฉันไม่เข้าใจ
Kyle Strand

ฉันคิดว่ามันถูกโพสต์เพื่อแก้ไขปัญหาที่กล่าวถึงในความเห็นของคำตอบที่ยอมรับ - %~dp0สามารถเป็นญาติซึ่งอาจจะใช่หรือไม่ใช่ปัญหาขึ้นอยู่กับกรณีการใช้งาน
Michael Mrozek

10
%~dp0ไม่สามารถมีพา ธ สัมพัทธ์dย่อมาจากไดรฟ์และpสำหรับพา ธ ไดรฟ์อาจสัมพันธ์กันอย่างไร
2560

5
โลกไหน? ฉันเพิ่งทดสอบคำตอบนี้ใน Windows Server 2012 r2 และปรากฎ%~dp0ว่าเป็นเส้นทางที่แน่นอนแม้ว่าสคริปต์จะทำงานเป็นเส้นทางสัมพัทธ์ ขอบคุณที่คอมเม้นท์ของ jeb ฉันไม่ได้ถูกหลอกด้วยคำตอบนี้ ทำไมผู้คนถึงทำสิ่งต่าง ๆ ขึ้นมาและเริ่มแพร่กระจายจินตนาการของพวกเขาไปสู่ผู้อื่น ฉันมีเพื่อนร่วมงานคนนี้ที่ทำสิ่งนี้ แต่ฉันโทษอายุ (เด็ก) ของเขา ฉันหวังว่าคะแนนโหวตของฉันจะถูกนับ
bitoolean

0

คุณสามารถใช้%~dp0, d หมายถึงไดรฟ์เท่านั้น, p หมายถึงพา ธ เท่านั้น, 0 คืออาร์กิวเมนต์สำหรับชื่อไฟล์แบบเต็มของไฟล์แบตช์

ตัวอย่างเช่นหากเส้นทางของไฟล์คือ C: \ Users \ Oliver \ Desktop \ example.bat ดังนั้นอาร์กิวเมนต์จะเท่ากับ C: \ Users \ Oliver \ Desktop \ นอกจากนี้คุณยังสามารถใช้คำสั่งset cpath=%~dp0 && set cpath=%cpath:~0,-1%และใช้%cpath%ตัวแปรเพื่อลบเครื่องหมายสแลชต่อท้าย


1
ฉันไม่สามารถเห็นข้อมูลใด ๆ ได้มากไปกว่าคำตอบอายุ 9 ปี
jeb

ข้อมูลเพิ่มเติมคือ "d หมายถึงไดรฟ์เท่านั้น ... " ฯลฯ ขอบคุณ @Hayz
RJ Dunnill

-2

%cd% จะให้เส้นทางของไดเรกทอรีจากที่สคริปต์ทำงาน

เพิ่งรัน:

echo %cd%

%CD%เป็นโฟลเดอร์การทำงานปัจจุบันไม่ใช่โฟลเดอร์ที่จัดเก็บไฟล์แบตช์ พวกเขาสามารถเป็นสถานที่เดียวกัน แต่บ่อยครั้งที่พวกเขาไม่ได้
เตฟาน

-7

นั่นจะเป็น%CD%ตัวแปร

@echo off
echo %CD%

%CD% ส่งคืนไดเร็กทอรีปัจจุบันที่สคริปต์แบตช์อยู่


35
% cd% ส่งคืนไดเรกทอรีที่สคริปต์รันไม่ใช่ไดเรกทอรีที่สคริปต์นั้นตั้งอยู่
Misha Moroshko

4
ใช้งานได้เฉพาะถ้าสคริปต์ของคุณไม่ได้แก้ไขไดเรกทอรีทำงาน ลองCD C:\Temp <CR> ECHO %CD%(ขึ้น<CR>บรรทัดใหม่ ... )
Dean Harding

6
นอกจากนี้หากคุณคลิกขวาที่สคริปต์และเลือก "Run as Administrator" ไดเรกทอรีปัจจุบันเริ่มต้นคือ C: \ Windows \ System32 ไม่ว่าสคริปต์จะอยู่ที่ใด
Cameron

แม้ว่าจะไม่ใช่คำตอบที่ตรงกับคำถามของ OP แต่รสชาติของฟังก์ชั่นนี้เป็นสิ่งที่ฉันกำลังมองหาเมื่อฉันพบคำถามนี้ ขอบคุณ!
Zoltán

ไม่มีวิธีแก้ไขปัญหาอื่น ๆ ที่โพสต์ปรากฏสำหรับฉันบน Win7 32 บิต cmd.exe ซึ่งมีประโยชน์สำหรับฉันอย่างน้อย
Clifford

-8

ฉันกำลังทำงานกับเครื่อง Windows 7 และฉันได้ลงเอยด้วยการใช้บรรทัดด้านล่างเพื่อรับเส้นทางโฟลเดอร์แบบสมบูรณ์สำหรับสคริปต์ทุบตีของฉัน

ฉันได้ไปแก้ปัญหานี้หลังจากที่กำลังมองหาที่http://www.linuxjournal.com/content/bash-parameter-expansion

#Get the full aboslute filename.
filename=$0
#Remove everything after \. An extra \ seems to be necessary to escape something...
folder="${filename%\\*}"
#Echo...
echo $filename
echo $folder

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