ประการแรกฉันเห็นหัวข้อนี้แต่ฉันไม่เข้าใจ
คำถาม:
มีไฟล์แบตช์ที่D:\path\to\file.bat
มีเนื้อหาดังต่อไปนี้:
echo %cd%
pause
ผลลัพธ์คือ:
C:\
มันจะต้องเป็น D:\path\to
ผมทำอะไรผิดหรือเปล่า?
ประการแรกฉันเห็นหัวข้อนี้แต่ฉันไม่เข้าใจ
คำถาม:
มีไฟล์แบตช์ที่D:\path\to\file.bat
มีเนื้อหาดังต่อไปนี้:
echo %cd%
pause
ผลลัพธ์คือ:
C:\
มันจะต้องเป็น D:\path\to
ผมทำอะไรผิดหรือเปล่า?
คำตอบ:
ระบบแบบอ่านอย่างเดียวตัวแปร%CD%
เก็บเส้นทางของผู้เรียกของแบทช์ไม่ใช่ตำแหน่งไฟล์แบทช์
คุณสามารถได้รับชื่อของสคริปต์ชุดงานตามที่ผู้ใช้พิมพ์ด้วย%0
(เช่นscripts\mybatch.bat
) ส่วนขยายพารามิเตอร์สามารถใช้กับสิ่งนี้ได้ดังนั้น%~dp0
จะส่งคืนไดรฟ์และเส้นทางไปยังสคริปต์ชุดงาน (เช่นW:\scripts\
) และ%~f0
จะส่งคืนชื่อพา ธ แบบเต็ม (เช่นW:\scripts\mybatch.cmd
)
คุณสามารถอ้างถึงไฟล์อื่น ๆ ในโฟลเดอร์เดียวกันกับสคริปต์ชุดงานโดยใช้ไวยากรณ์นี้:
CALL %0\..\SecondBatch.cmd
สิ่งนี้สามารถใช้ในรูทีนย่อยEcho %0
จะให้ป้ายชื่อการโทร แต่echo "%~nx0"
จะให้ชื่อไฟล์ของสคริปต์แบทช์
เมื่อ%0
ตัวแปรถูกขยายผลลัพธ์จะอยู่ในเครื่องหมายคำพูด
stm.sql
D:\Dir1\Dir2\stm.sql
ฉันต้องการ mysql.exe -u root -p mysql < %cd%\stm.sql
รันคำสั่ง stm.sql
*.bat
หรือ*.sh
?
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 บางคำสั่ง
echo %~dp0
จะส่งคืนพา ธ ไปยังตำแหน่งแบทช์ echo %~f0
จะคืนค่าพา ธ ไปยังแบตช์ด้วยชื่อไฟล์
ง่ายมาก:
setlocal
cd /d %~dp0
File.exe
cd /d %~dp0
เป็นบรรทัดแรกของแบตช์ไฟล์และทำงาน
ภายในไฟล์. bat ของคุณ:
set mypath=%cd%
ตอนนี้คุณสามารถใช้ตัวแปร%mypath%
เพื่ออ้างอิงเส้นทางของไฟล์ไปยัง.bat
ไฟล์ ในการตรวจสอบเส้นทางให้ถูกต้อง:
@echo %mypath%
ตัวอย่างเช่นไฟล์ที่เรียกว่าDIR.bat
มีเนื้อหาดังต่อไปนี้
set mypath=%cd%
@echo %mypath%
Pause
เรียกใช้จากไดเรกทอรีg:\test\bat
จะสะท้อนเส้นทางนั้นในหน้าต่างคำสั่ง DOS
นี่คือสิ่งที่ฉันใช้ที่ด้านบนของไฟล์แบตช์ทั้งหมด ฉันเพิ่งคัดลอก / วางจากโฟลเดอร์แม่แบบของฉัน
@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 ทำเช่นนี้และอีกมากมาย
set batdir=%CD%
) ไม่เป็นไรเพราะเป็นเส้นทางไปยังผู้โทรไม่ใช่ไฟล์แบ็ตตัวเอง %~dp0
วิธีที่ถูกต้องเท่านั้นที่จะได้รับเส้นทางไปยังแฟ้มค้างคาวดำเนินการคือ