ฉันจะหลีกเลี่ยงช่องว่างในบรรทัดคำสั่งใน Windows โดยไม่ใช้เครื่องหมายคำพูดได้อย่างไร


88

ตัวอย่างเช่นทางเลือกของคำสั่งนี้ที่ไม่มีเครื่องหมายคำพูดคืออะไร:

CD "c:\Documents and Settings"

เหตุผลที่ฉันไม่ต้องการใช้เครื่องหมายอัญประกาศคือว่าคำสั่งนี้ใช้งานได้:

   SVN add mypathname\*.*

แต่คำสั่งนี้ใช้งานไม่ได้:

   SVN add "mypathname\*.*"

ปัญหาเกิดขึ้นเมื่อฉันเปลี่ยนชื่อพา ธ สำหรับพา ธ ที่มีช่องว่างในนั้นฉันจำเป็นต้องเสนอราคาทั้งหมด ตัวอย่างเช่น:

SVN add "c:\Documents and Settings\username\svn\*.*"

แต่เมื่อฉันลองทำสิ่งนี้ฉันจะได้รับข้อความแสดงข้อผิดพลาดดังนี้

svn: warning: 'c:\Documents and Settings\username\svn\*.*' not found

2
คุณหมายถึงคุณมีเหตุผลที่ดีที่ 'ไม่' ต้องการใช้เครื่องหมายคำพูด
โทมัส

ทำไมรหัสเครื่องหมายคำพูดของคุณถึงหัก? :)
slhck

3
@slhck ไม่ต้องกังวลรหัส shift และ key 2 ของฉันก็โอเคอย่างสมบูรณ์แบบ! ฉันใช้คำสั่งที่ไม่อนุญาตให้ใช้สัญลักษณ์แทนเมื่อพวกเขาแอบอ้างภายในเครื่องหมายคำพูดนั่นคือทั้งหมด!
David

1
@ MarkBooth และ @WeltenWanderer ลองดี แต่น่าเสียดายที่นี่ใช้งานไม่ได้ ในทั้ง 3 กรณีฉันได้รับ "svn: ข้อผิดพลาดในการแก้ไขกรณีของ ..... "
David

1
คุณลองใช้การจัดรูปแบบชื่อ 8.3 (DOCUME ~ 1) เก่าหรือไม่
Justin Pearce

คำตอบ:


55

มันใช้งานได้เกือบทั้งหมดสำหรับฉัน แต่คุณอาจลองใช้สาย 5 .. ใช้ช่องว่างที่มีสัญลักษณ์รูปหมวก (^)

1 C:\Documents and Settings\user>cd ..

2 C:\Documents and Settings>cd ..

3 C:\>cd Documents and Settings

4 C:\Documents and Settings>cd..

5 C:\>cd Documents^ and^ Settings

6 C:\Documents and Settings>cd..

7 C:\>cd C:\documents and settings

8 C:\Documents and Settings>cd..

9 C:\>

หรือเช่นด้านล่างที่เครื่องหมายรูปหมวกที่สร้างความแตกต่างทั้งหมด

ดูจากด้านล่างเช่นสัญลักษณ์คาเร็ตอาจเป็นคำตอบของคุณดูบรรทัดที่ 3 ด้านล่าง

1 C:\>"c:\Documents and Settings\a.bat"
gaga

2 C:\>c:\Documents and Settings\a.bat
'c:\Documents' is not recognized as an internal or external command,
operable program or batch file.

3 C:\>c:\Documents^ and^ Settings\a.bat
gaga

C:\>

เนื่องจากการโค่นล้มเป็นเครื่องมือของโปรแกรมเมอร์จึงอาจเหมาะสมสำหรับ SO นี่คือคำถามที่เกี่ยวข้องกับ stackoverflow.com/questions/757435/ … คุณอาจใช้เครื่องหมายคำพูดหรือเครื่องหมายรูปหมวกเพื่อไปยัง svn จากนั้นบางทีคุณอาจใช้แบ็กสแลชก่อนแต่ละช่องว่าง
barlop

คุณสามารถลองใช้ svn ของ cygwin หากอยากรู้อยากเห็น .. ด้วยตัวอย่างคำตอบในคำถามนั้นและดูว่ารูปแบบใดหรือรูปแบบใดที่เหมาะกับคุณ
barlop

5
สัญลักษณ์คาเร็ตตอบคำถามของฉันโดยตรงดังนั้นฉันจะยอมรับคำตอบของคุณ น่าเสียดายที่คำสั่ง SVN ดูเหมือนจะไม่รู้จัก! หากฉันลองฉันได้รับข้อความแสดงข้อผิดพลาด "svn 'C:' ไม่ใช่สำเนาที่ใช้งานได้" ฉันมีวิธีอื่นรอบ ๆ แม้ว่าและนั่นคือเพียง 'cd' ไปยังไดเรกทอรีก่อนแล้วรันคำสั่ง SVN เมื่อมี ฉันสามารถเชื่อมโยงคำสั่งทั้งสองเข้าด้วยกันในบรรทัดเดียวโดยใช้ตัวดำเนินการ &&: cd "c: \ Documents and Settings \ ชื่อผู้ใช้ \ svn" && SVN เพิ่ม *. *
David

ในตัวอย่างซีดีไม่ต้องใช้เครื่องหมายรูปหมวกและซีดีไม่จำเป็นต้องมีช่องว่างเพื่อหลีกเลี่ยง
barlop

1
@ Chinggis6 น่าสนใจ .. มันไม่ทำงานสำหรับ DIR เช่นกัน ทั้งการคัดลอกและ dir ถูกสร้างขึ้นในคำสั่ง .. แม้ว่าจะเป็นซีดี แม้ว่าการคัดลอกและ dir จะใช้ชื่อไฟล์เป็นพารามิเตอร์ อาจคุ้มค่าที่จะถามในฟอรัม
dostips

35

ฉันพบว่าการใส่เครื่องหมายคำพูดรอบ ๆ ส่วนหนึ่งของตำแหน่งนั้นใช้ได้ ในกรณีของคุณ:

SVN add C:\"Documents and Settings"\username\svn\*.*

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


7
ถ้าใครอยากจะเรียบง่ายใคร ๆ ก็สามารถพูดไปรอบ ๆ ช่องว่างหรือแค่ตัวอักษรที่มีช่องว่างเช่น c: \> cd เอกสาร "และ se" ttings ttings (แม้ว่าอีกตัวอย่าง cd ใครไม่จำเป็นต้องหนี ช่องว่าง)
barlop

1
ขอบคุณมาก. ฉันอาจจะ
อัปโหลด

@Sayka คำถามที่ได้ถามว่า "ฉันจะหนีช่องว่างในบรรทัดคำสั่งใน Windows โดยไม่ต้องใช้เครื่องหมายคำพูด? "
barlop

2
@barlop แน่นอน แต่เหตุผลที่ไม่มีเครื่องหมายคำพูดคือเครื่องหมายดอกจันไม่ทำงานเมื่ออยู่ในเครื่องหมายคำพูด วิธีแก้ปัญหาที่ฉันหลีกเลี่ยงได้เนื่องจากเครื่องหมายดอกจันอยู่นอกเครื่องหมายอัญประกาศ คำตอบนี้ไม่ได้ปฏิบัติตามตัวอักษรของคำถาม แต่มันปฏิบัติตามจิตวิญญาณของคำถาม (เช่นมันทำงานเพื่อวัตถุประสงค์ที่ตั้งใจ)
Kit Johnson

26

แม้จะมีคำตอบให้ภาพลวงตาที่ใช้งานได้ความจริงก็คือคุณไม่สามารถแอบเข้าไปในช่องว่างในการโต้แย้ง cmd ปกติ นี่เป็นเรื่องง่ายที่จะพิสูจน์:

  1. บันทึก " echo %1" test.batเป็น ไฟล์ชุดนี้จะส่งออกอาร์กิวเมนต์แรกซึ่ง cmd ผ่านเรา

  2. ตอนนี้พยายามและเรียกใช้test.batการตั้งค่าของการ%1 foo bar(โปรดทราบว่ามีช่องว่างระหว่างfooและbar.)

  3. ทดลองและข้อผิดพลาดไม่กี่ปีและตระหนักดีว่ามีวิธีที่จะทำมันไม่มี คนจะแนะนำที่จะหลบหนีโดยใช้^แต่จะไม่เอาท์พุทtest.bat foo^ barfoo bar

ดังนั้นไม่มีทางที่จะได้รับผลไม่foo barและที่ใกล้เคียงที่สุดที่เราได้รับคือการทำงานtest.bat foo" "barซึ่งเป็นผู้ผลิตfoo" "barหรือการทำงานซึ่งเป็นผู้ผลิตtest.bat "foo bar""foo bar"


ตอนนี้เหตุผลที่คำตอบอื่น ๆปรากฏในการทำงานเป็นเพราะcdไม่เป็นของตัวเองแยกเพิ่มเติมแยกจากพฤติกรรมของการโต้แย้งปกติผ่าน (ปกติ%1, %2, %3และ ฯลฯ ในไฟล์ชุดทั่วไป)

ตัวอย่างเช่นพิจารณาคำสั่งเฉพาะ:

cd c:\documents and settings \some folder with spaces

ทำไมมันทำงาน นี่คือสาเหตุที่cd ตัวเองทำบางสิ่งบางอย่างที่เทียบเท่ากับการเข้าร่วม 7 ข้อโต้แย้งปกติเป็นหนึ่งตรรกะหนึ่ง ตามการโต้แย้ง cmd ผ่านบรรทัดฐานเราจะเห็นข้อโต้แย้งที่ 7:

  1. c:\documents
  2. and
  3. settings
  4. \some
  5. folder
  6. with
  7. spaces

ราวกับว่าcdได้เข้าร่วมการขัดแย้งทั้ง 7 ข้อในตรรกะเดียวการทำสิ่งที่คล้ายกับarray.join(" ")ซึ่งก่อให้เกิดเส้นทาง:

c:\documents and settings \some folder with spaces

โปรดทราบว่าพฤติกรรมนี้เป็นสิ่งที่แปลกประหลาดcdเฉพาะ (และฟังก์ชั่นอื่น ๆ ) มันไม่มีส่วนเกี่ยวข้องกับการผ่านการโต้แย้งปกติ


แน่นอนcdมีลักษณะผิดปกติอื่น โปรดจำไว้ว่าเราระบุไว้ข้างต้นว่าเราไม่สามารถรับผลลัพธ์ได้foo barหรือไม่ ผลลัพธ์ที่ใกล้เคียงที่สุดที่เราจะได้รับคือการทำงาน:

test.bat foo" "bar

ซึ่งผลิตfoo" "barหรือ:

test.bat "foo bar"

ซึ่งผลิต"foo bar"หรือ:

test.bat "foo "bar

ซึ่งผลิต"foo "barหรือ:

test.bat foo" bar"

ซึ่งผลิตfoo" bar"หรือ:

test.bat "foo b"ar

ซึ่งผลิต"foo b"arหรือ:

test.bat fo"o bar"

ซึ่งผลิตfo"o bar"หรือ:

test.bat fo"o ba"r

ซึ่งผลิตfo"o ba"rหรือ:

test.bat "fo"o" bar"

ซึ่งผลิต"fo"o" bar"หรือ:

test.bat "f""o""o"" ""b""a""r":

ซึ่งผลิต"f""o""o"" ""b""a""r"หรือแม้กระทั่ง:

test.bat """"f"""o""""o"" ""ba"""r"""""""""":

""""f"""o""""o"" ""ba"""r""""""""""ซึ่งเป็นผู้ผลิต

ตัวอย่างข้างต้นทั้งหมดมีความคล้ายคลึงกันอย่างใดอย่างหนึ่งซึ่งพวกเขาจะผลิตfoo barหลังจากเราตัดออก"ตัวอักษร cdผู้เขียนจะต้องตระหนักถึงสิ่งนี้ด้วย ... หากเราต้องอนุมานจากcdพฤติกรรมที่แปลกประหลาดซึ่งตัดสิ่งที่"ได้รับออกไปทำให้คำสั่งทั้งหมดเหล่านี้ทำงานได้:

  • cd c:\documents and settings

  • cd "c:\documents and settings"

  • cd "c:"\"documents and settings"

  • cd c:\"documents" "and" "settings"

  • cd c:\"docu"ments an"d set"tings"

  • cd c:"\"docu"ments an"d set"ti"""ngs

  • cd "c"":""\"docu"ments an"d set"ti"""ngs

  • cd "c"":""\"do""cu"me"nts a"n""d set"ti"""ngs

  • cd c"""":""""\"""d"""oc""""u"me"""""nt"s a"n""d set"""""""ti""""ngs


15
สิ่งที่เขียนโปรแกรมหน้าต่างชุดระเบียบ ...
Klangen

ขอบคุณ เราสามารถตัดสินได้ว่าซีดีกำลังใช้งานอยู่argv[]หรือGetCommandLine()ไม่? pastebin.com/raw/t55iv0JS
barlop

7

ชื่อไฟล์สั้น ๆ ดูเหมือนจะทำงานเหมือนสายลม

"E: \ Progra ~ 1 \ Java \ Eclipse \ eclipse.exe" -vmargs -Xms1024m -Xmx2048m

สำหรับเพิ่มหน่วยความจำ .. ;)


8
มันอาจไม่ทำงานหากชื่อไฟล์สั้นถูกปิดใช้งาน
phuclv


2

สำหรับผู้ที่พูดถึงการเปลี่ยน 8.3 โปรดทราบสองสิ่งต่อไปนี้:

  • 8.3 สามารถตั้งค่าเป็นปิดการใช้งาน (หรือเปิดใช้งาน) บน NTFS ดังนั้นจึงอาจไม่มีอยู่จริง
  • ชื่อ 8.3 ของไฟล์ / โฟลเดอร์สามารถเปลี่ยนแปลงได้โดยไม่ต้องแจ้งให้ทราบล่วงหน้าเพียงแค่สร้างเปลี่ยนชื่อหรือลบสิ่งอื่น ๆ ในโฟลเดอร์เดียวกัน

ดังนั้นc:\docume~1สามารถชี้ไปที่:

  • ไม่มีที่ไหนเลย (ไม่ถูกต้อง)
  • โฟลเดอร์ที่คุณต้องการ
  • โฟลเดอร์อื่น
  • โฟลเดอร์ตัวแปรตามเวลา

มันไม่ปลอดภัยเว้นแต่คุณจะได้รับชื่อย่อและใช้ในการดำเนินงานปรมาณู

แม้ว่ามันจะแปลกมากที่พวกเขาเปลี่ยนเป็นเรื่องธรรมดาที่พวกเขาไม่มีอยู่จริง

หากคุณต้องการทราบว่ามี 8.3 ไฟล์สำหรับโฟลเดอร์ / ไฟล์ที่เฉพาะเจาะจงให้ทดสอบด้วยพารามิเตอร์/Xในdirคำสั่งหรือใส่แค็ปซูลลงบน a forเพื่อรับเฉพาะส่วนนั้น ๆ เป็นต้น

สำหรับข้อมูลเพิ่มเติมเกี่ยวกับวิธีเปิด / ปิดการใช้งาน 8.3 บนระบบไฟล์ NTFS ดูบทความการสนับสนุนของ Microsoft ที่นี่:
https://support.microsoft.com/en-us/help/121007/how-to-disable-8-3-file-name- สร้างบน NTFS พาร์ทิชัน


0

ติดตามโพสต์ของ @ Pang และคนอื่น ๆ พูดคุยชื่อสั้น ๆ และข้อผิดพลาดต่อไปนี้เป็นวิธีแก้ไขชื่อยาวแบบไดนามิกเป็นชื่อย่อ:

for %A in ("C:\Some\long path\which must exist\to be resolved") do @echo %~sA

จากนั้นเห็นได้ชัดว่าคุณสามารถใช้ชื่อย่อแทนคำพูดโดยรอบ

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