ตั้งค่าตัวแปรพา ธ ที่มีช่องว่างในพา ธ ในไฟล์ Windows .cmd หรือไฟล์แบตช์


112

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

ฉันต้องการแยกการอัปเดต Office จำนวนมากไปยังโฟลเดอร์ที่มีไฟล์. cmd ในการทำให้ไฟล์แบตช์ใช้งานบนคอมพิวเตอร์เครื่องใดก็ได้ฉันตั้งค่าตัวแปรพา ธ ซึ่งฉันต้องเปลี่ยนเพียงที่เดียวเพื่อเรียกใช้บนเครื่องอื่น ปัญหาคือทางเดินมีช่องว่างอยู่ ถ้าฉันใส่เครื่องหมายคำพูดรอบ ๆ เส้นทางในคำจำกัดความ cmd.exe จะวางไว้รอบ ๆ เส้นทางก่อนที่จะต่อท้ายชื่อไฟล์และสวิตช์และแบตช์ล้มเหลวด้วย "ข้อผิดพลาดทางไวยากรณ์ของบรรทัดคำสั่ง" หากไม่มีเครื่องหมายคำพูดจะล้มเหลวด้วย "ไม่รู้จักว่าเป็นคำสั่งภายในหรือภายนอกโปรแกรมที่ใช้งานได้หรือไฟล์แบตช์"

สำหรับการทดสอบฉันใช้สวิตช์ความช่วยเหลือจนกว่าหรือถ้าจะทำให้มันใช้งานได้ ฉันสามารถทำได้โดยใช้ชื่อไฟล์ / โฟลเดอร์ 8.3 (เช่นเอกสารของฉันเป็น MyDocu ~ 1) แต่สามารถทำได้ด้วยวิธีอื่นหรือไม่?


เครื่องหมายคำพูดต้องมีพา ธ ที่มีชื่อไฟล์และต้องเป็นไปตามพารามิเตอร์บรรทัดคำสั่ง คุณสามารถให้รายละเอียดเพิ่มเติมเกี่ยวกับวิธีสร้างบรรทัดคำสั่งได้หรือไม่? คุณหมายถึงว่า> ถ้าฉันใส่เครื่องหมายคำพูดรอบ ๆ เส้นทางในคำจำกัดความ cmd.exe จะวางไว้รอบ ๆ เส้นทางก่อนที่จะต่อท้ายชื่อไฟล์และสวิตช์
vladhorby

คำตอบ:


104

ลองทำสิ่งนี้:

SET MY_PATH=C:\Folder with a space

"%MY_PATH%\MyProgram.exe" /switch1 /switch2

นั่นคือสิ่งที่ฉันใช้ Replace ใน Notepad ขอบคุณ.
marcerickson

5
ดีใจที่ช่วยได้ คงจะดีไม่น้อยถ้าคุณโหวตและยอมรับคำตอบที่คุณคิดว่าช่วยคุณได้
คำพังเพย

75

ฉันใช้

set "VAR_NAME=<String With Spaces>"

เมื่ออัปเดตเส้นทาง:

set "PATH=%UTIL_DIR%;%PATH%"

3
นี่ควรเป็นคำตอบที่ยอมรับได้ ด้วยเหตุผลบางประการการเรียกชุดจาก if block ไม่ทำงานหากค่ามีช่องว่างและไม่มีเครื่องหมายคำพูด
Kevin

33

มีสองตัวเลือกที่นี่ ขั้นแรกคุณสามารถจัดเก็บเส้นทางที่ไม่มีการอ้างสิทธิ์และอ้างถึงในภายหลัง:

set MyPath=C:\Program Files\Foo
"%MyPath%\foo with spaces.exe" something

อีกทางเลือกหนึ่งที่คุณสามารถใช้ได้คือรูทีนย่อยซึ่งใช้แทนการยกเลิกการอ้างถึงสตริง (แต่ในกรณีนี้มันไม่ใช่ความคิดที่ดีมากนักเนื่องจากคุณกำลังเพิ่มเครื่องหมายคำพูดตัดคำเหล่านั้นออกไปและเพิ่มใหม่อีกครั้งโดยไม่มีประโยชน์):

set MyPath="C:\Program Files\Foo"
call :foo %MyPath%
goto :eof

:foo
"%~1\foo.exe"
goto :eof

%~1เอาเครื่องหมายอัญประกาศรอบอาร์กิวเมนต์ สิ่งนี้มีประโยชน์เมื่อส่งชื่อโฟลเดอร์รอบ ๆ ที่ยกมา แต่อย่างที่กล่าวไว้ก่อนหน้านี้ในกรณีนี้มันไม่ใช่ความคิดที่ดีที่สุด :-)


ฉันใช้วิธีแรกโดยใช้แทนที่ใน Notepad อันที่สองดูซับซ้อนโดยไม่จำเป็น ขอบคุณ.
marcerickson

2
ฉันมีไฟล์ Batch ที่ได้รับพารามิเตอร์ การใช้set LALA=%~1คือสิ่งที่ได้ผลสำหรับฉัน
JCH2k

วิธีที่ 2 ใช้งานได้ดีเมื่อคุณใช้subrutines
robe007

16

ลองดู

  1. สร้างตัวแปรด้านล่าง

    SET "SolutionDir=C:\Test projects\Automation tests\bin\Debug"**
    
  2. จากนั้นแทนที่เส้นทางด้วยตัวแปร อย่าลืมใส่เครื่องหมายคำพูดสำหรับการเริ่มต้นและสิ้นสุด

    vstest.console.exe "%SolutionDir%\Automation.Specs.dll"
    

8

ฉันมักจะวางเส้นทางไว้ในเครื่องหมายคำพูดคู่เมื่อฉันสร้างไฟล์. bat (ฉันเพิ่งเพิ่มการหยุดชั่วคราวเพื่อไม่ให้ปิดหน้าจอ)

ตัวอย่างเช่น:

"C:\Program Files\PageTech\PCLReader64_131\PCLReader64.exe"
PAUSE

7

วิธีที่เหมาะสมในการทำเช่นนี้:

@ECHO off
SET MY_PATH=M:\Dir\^
With Spaces\Sub Folder^
\Dir\Folder
:: calls M:\Dir\With Spaces\Sub Folder\Dir\Folder\hello.bat
CALL "%MY_PATH%\hello.bat"
pause

5

วิธีที่ง่ายที่สุดในการแก้ไขปัญหานี้คือใส่ชื่อโฟลเดอร์ในเครื่องหมายคำพูด:

(cd\New Folder\...) --> (cd\"New Folder"\...)

หวังว่านี่จะช่วยได้


2

หากคุณต้องการจัดเก็บเส้นทางถาวร (เส้นทางจะไม่เปลี่ยนเมื่อ cmd เริ่มต้นใหม่)

  1. เรียกใช้ Command Prompt ในฐานะผู้ดูแลระบบ (คลิกขวาที่ cmd.exe แล้วเลือก run as administrator)

  2. ใน cmd setx path "%path%;your new path" ให้ป้อน

  3. ตรวจสอบว่าพา ธ ถูกต้องหรือไม่โดยพิมพ์ path และกด Enter


1
ฉันคิดว่าคำถามไม่ได้เกี่ยวกับตัวแปรPATHแต่เกี่ยวกับตัวแปรเส้นทาง เห็นได้ชัดว่า OP ต้องการจัดเก็บเส้นทางเฉพาะลงในตัวแปรและใช้ค่าข้ามสคริปต์ชุดงาน
Andriy M

1

ลองเพิ่มเครื่องหมายทับคู่แบบนี้ได้ผลสำหรับฉันเท่านั้น

ตั้งค่า dir = "C: \\ 1. Some Folder \\ Some Other Folder \\ Just Because"

@echo บน MKDIR% dir%

OMG หลังจากโพสต์พวกเขาได้ลบ \ ที่สองในโพสต์ของฉันดังนั้นหากคุณเปิดความคิดเห็นของฉันและแสดงว่าสามคุณควรอ่านเป็นสอง ...

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