รับไดเรกทอรี batchfile ปัจจุบัน


283

ประการแรกฉันเห็นหัวข้อนี้แต่ฉันไม่เข้าใจ

คำถาม:

มีไฟล์แบตช์ที่D:\path\to\file.batมีเนื้อหาดังต่อไปนี้:

echo %cd%
pause

ผลลัพธ์คือ:

C:\

มันจะต้องเป็น D:\path\to

ผมทำอะไรผิดหรือเปล่า?


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

4
หากคุณอยู่ใน c: \ เมื่อคุณพิมพ์ชื่อไฟล์แบตช์ c: \ คือสิ่งที่% cd% จะพิมพ์
foxidrive

คำตอบ:


496

ระบบแบบอ่านอย่างเดียวตัวแปร%CD%เก็บเส้นทางของผู้เรียกของแบทช์ไม่ใช่ตำแหน่งไฟล์แบทช์

คุณสามารถได้รับชื่อของสคริปต์ชุดงานตามที่ผู้ใช้พิมพ์ด้วย%0(เช่นscripts\mybatch.bat) ส่วนขยายพารามิเตอร์สามารถใช้กับสิ่งนี้ได้ดังนั้น%~dp0จะส่งคืนไดรฟ์และเส้นทางไปยังสคริปต์ชุดงาน (เช่นW:\scripts\) และ%~f0จะส่งคืนชื่อพา ธ แบบเต็ม (เช่นW:\scripts\mybatch.cmd)

คุณสามารถอ้างถึงไฟล์อื่น ๆ ในโฟลเดอร์เดียวกันกับสคริปต์ชุดงานโดยใช้ไวยากรณ์นี้:

CALL %0\..\SecondBatch.cmd

สิ่งนี้สามารถใช้ในรูทีนย่อยEcho %0จะให้ป้ายชื่อการโทร แต่echo "%~nx0"จะให้ชื่อไฟล์ของสคริปต์แบทช์

เมื่อ%0ตัวแปรถูกขยายผลลัพธ์จะอยู่ในเครื่องหมายคำพูด

เพิ่มเติมเกี่ยวกับชุดพารามิเตอร์


1
ดูผมไม่จำเป็นต้องใช้ในstm.sql D:\Dir1\Dir2\stm.sqlฉันต้องการ mysql.exe -u root -p mysql < %cd%\stm.sqlรันคำสั่ง stm.sql
Hamed Kamrava

@HamedKamrava สำหรับชุด SQL ของฉันคืออะไร ไม่แบทช์ไฟล์เหมือน*.batหรือ*.sh?
Stoleg

@ Stoleg- ในความเป็นจริงมี 2 ไฟล์ในมีและD:\Dir1\Dir2\batchfile.bat D:\Dir1\Dir2\stm.sqlเนื้อหา batchfile.bat คือ: mysql.exe -u root -p mysql < D:\Dir1\Dir2\stm.sqlและเนื้อหา stm.sql คือคำสั่ง MySQL บางคำสั่ง
Hamed Kamrava

1
ระบบแบบอ่านอย่างเดียว% CD% เก็บเส้นทางของผู้เรียกของแบทช์ไม่ใช่ตำแหน่งไฟล์แบทช์
Stoleg

34
echo %~dp0จะส่งคืนพา ธ ไปยังตำแหน่งแบทช์ echo %~f0จะคืนค่าพา ธ ไปยังแบตช์ด้วยชื่อไฟล์
Stoleg

119

ง่ายมาก:

setlocal
cd /d %~dp0
File.exe

9
รหัสสั้น แต่ไม่เข้าใจง่าย File.exe นี้คืออะไร เส้นทางไดเรกทอรีปัจจุบันถูกเก็บไว้ใน% ~ dp0 หรือไม่
Ivailo Bardarov

คำตอบนี้จริงตอบคำถามฉันคิดว่า ความรุ่งโรจน์
macetw

3
ฉันเพิ่งใช้cd /d %~dp0เป็นบรรทัดแรกของแบตช์ไฟล์และทำงาน
mkb

ทำไมต้อง setlocal มันจะกลับมาอย่างดีถ้าไม่มีเช่นกัน?
T.Todua

1
@ T.Todua "setlocal" ทำให้เกิดการเปลี่ยนแปลงสภาพแวดล้อมใด ๆ รวมถึงไดเรกทอรีปัจจุบันที่จะถูกเก็บไว้จนกว่าจะจบแบตช์ไฟล์หรือพบ "endlocal" หากคุณกำลังจะเปลี่ยนตัวแปรสภาพแวดล้อมหรือไดเรกทอรีปัจจุบันมันเป็นรูปแบบที่ดี
Jamie

30

ภายในไฟล์. bat ของคุณ:

set mypath=%cd%

ตอนนี้คุณสามารถใช้ตัวแปร%mypath%เพื่ออ้างอิงเส้นทางของไฟล์ไปยัง.batไฟล์ ในการตรวจสอบเส้นทางให้ถูกต้อง:

@echo %mypath%

ตัวอย่างเช่นไฟล์ที่เรียกว่าDIR.batมีเนื้อหาดังต่อไปนี้

set mypath=%cd%
@echo %mypath%
Pause

เรียกใช้จากไดเรกทอรีg:\test\batจะสะท้อนเส้นทางนั้นในหน้าต่างคำสั่ง DOS


1
นี่เป็นทางออกที่ดีที่สุดและง่ายที่สุด
Nani

7
นี่ไม่ใช่วิธีแก้ปัญหาที่ดีเพราะไม่คำนึงถึงแบทช์สคริปต์ที่ถูกเรียกจากไฟล์อื่นในพา ธ อื่น
theQuestionMan

เมื่อเรียกใช้เป็นสิทธิ์ที่เพิ่มขึ้น% cd% จะส่งคืน C: \ Windows \ system32 แต่ไม่ใช่ไดเรกทอรีที่เก็บไว้
PravyNandas

9

นี่คือสิ่งที่ฉันใช้ที่ด้านบนของไฟล์แบตช์ทั้งหมด ฉันเพิ่งคัดลอก / วางจากโฟลเดอร์แม่แบบของฉัน

@echo off
:: --HAS ENDING BACKSLASH
set batdir=%~dp0
:: --MISSING ENDING BACKSLASH
:: set batdir=%CD%
pushd "%batdir%"

การตั้งค่าเส้นทางของแฟ้มแบตช์ปัจจุบันเป็น% batdir% ช่วยให้คุณสามารถเรียกมันใน stmts ที่ตามมาในไฟล์แบตช์ปัจจุบันโดยไม่คำนึงว่าไฟล์แบตช์นี้เปลี่ยนไปที่ใด การใช้ PUSHD ช่วยให้คุณใช้ POPD เพื่อตั้งค่าเส้นทางของไฟล์แบตช์นี้เป็น% batdir% ดั้งเดิมได้อย่างรวดเร็ว โปรดจำไว้ว่าหากใช้% batdir% ExtraDir หรือ% batdir% \ ExtraDir (ขึ้นอยู่กับเวอร์ชันที่ใช้ด้านบนสิ้นสุดแบ็กสแลชหรือไม่) คุณจะต้องใส่สตริงทั้งหมดในเครื่องหมายคำพูดคู่หากเส้นทางมีช่องว่าง (เช่น "% batdir% ExtraDir" ) คุณสามารถใช้ PUSHD% ~ dp0 ได้ตลอดเวลา [https: // ss64.com/ nt / syntax-args .html] มีพารามิเตอร์เพิ่มเติมเกี่ยวกับ (% ~)

โปรดทราบว่าการใช้ (: :) ที่จุดเริ่มต้นของบรรทัดทำให้เป็นบรรทัดความคิดเห็น ที่สำคัญกว่านั้นการใช้ :: ให้คุณใส่ตัวเปลี่ยนเส้นทางท่อตัวอักษรพิเศษ (เช่น <> | ฯลฯ ) ในความคิดเห็นนั้น

:: ORIG STMT WAS: dir *.* | find /v "1917" > outfile.txt

แน่นอน Powershell ทำเช่นนี้และอีกมากมาย


2
คำตอบที่ดีขอบคุณมาก! :-) เพียงระวังเทคนิคที่สองของคุณ ( set batdir=%CD%) ไม่เป็นไรเพราะเป็นเส้นทางไปยังผู้โทรไม่ใช่ไฟล์แบ็ตตัวเอง %~dp0วิธีที่ถูกต้องเท่านั้นที่จะได้รับเส้นทางไปยังแฟ้มค้างคาวดำเนินการคือ
Mitch McMabers
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.