ประการแรกฉันเห็นหัวข้อนี้แต่ฉันไม่เข้าใจ
คำถาม:
มีไฟล์แบตช์ที่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วิธีที่ถูกต้องเท่านั้นที่จะได้รับเส้นทางไปยังแฟ้มค้างคาวดำเนินการคือ