ใน Windows Explorer ทำไมเราสามารถสร้างโฟลเดอร์หรือไฟล์ที่มีสัญลักษณ์เปอร์เซ็น (%) ได้หากใช้สัญลักษณ์เปอร์เซ็นสำหรับตัวแปรที่มีอยู่


13
  1. ไปที่ Windows Explorer และสร้างโฟลเดอร์ / ไดเรกทอรีชื่อ%systemdrive%, %windir%หรือตัวแปรที่มีอยู่อื่น ๆ
  2. เปิดพรอมต์คำสั่งแล้วไปที่โฟลเดอร์ที่คุณเพิ่งสร้างขึ้น

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

การหลบหนี%สัญลักษณ์เปอร์เซ็น ( ) ที่มีสัญลักษณ์สองเปอร์เซ็นต์ ( %%) ไม่ทำงานดังนั้นคำตอบของ DavidPostill นั้นผิด:

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

คำตอบ:


16

ทำไมเราสามารถสร้างโฟลเดอร์ / ไฟล์ที่มีสัญลักษณ์เปอร์เซ็นได้

%ตัวละครไม่ได้เป็นตัวละครที่สงวนไว้ในชื่อไฟล์

อักขระที่สงวนไว้สำหรับการตั้งชื่อไฟล์พา ธ และเนมสเปซคือ:

< (less than)
> (greater than)
: (colon)
" (double quote)
/ (forward slash)
\ (backslash)
| (vertical bar or pipe)
? (question mark)
* (asterisk)

ไฟล์การตั้งชื่อซอร์ส, พา ธ และเนมสเปซ


สัญลักษณ์เปอร์เซ็นต์สงวนไว้สำหรับตัวแปร

ตอนนี้เปิดพร้อมท์คำสั่งแล้วลองไปที่โฟลเดอร์ที่คุณสร้างขึ้น

คุณไม่สามารถทำได้เพราะมีสัญลักษณ์เปอร์เซ็นต์ในชื่อโฟลเดอร์ซึ่งบ่งบอกว่าเป็นตัวแปร

ข้างต้นไม่เป็นความจริง ทุกอย่างทำงานได้ตามที่คุณคาดหวัง

ตัวอย่างการใช้%test%:

F:\test>echo %test%
%test%

F:\test>md %test%

F:\test>cd %test%

F:\test\%test%>

ตัวอย่างการใช้%systemdrive%:

F:\test>echo %systemdrive%
C:

F:\test>md %systemdrive%
A subdirectory or file C: already exists.

F:\test>cd %systemdrive%
C:\Users\DavidPostill

F:\test>c:

C:\Users\DavidPostill>f:

F:\test>

F:\test>dir %systemdrive%
 Volume in drive C has no label.
 Volume Serial Number is C8D0-DF1E

 Directory of C:\Users\DavidPostill

03/06/2016  16:16    <DIR>          .
03/06/2016  16:16    <DIR>          ..
18/07/2015  19:25    <DIR>          .atom
03/06/2016  16:16    <DIR>          .oracle_jre_usage
08/05/2015  20:29    <DIR>          Contacts
03/06/2016  16:14    <DIR>          Desktop
01/06/2016  09:04    <DIR>          Documents
02/05/2016  12:55    <DIR>          Downloads
09/01/2015  11:51    <DIR>          dwhelper
08/05/2015  20:29    <DIR>          Favorites
20/02/2016  22:00    <DIR>          Jaikoz
08/05/2015  20:29    <DIR>          Links
17/03/2015  06:19    <DIR>          Music
29/03/2016  19:01    <DIR>          Pictures
08/05/2015  20:29    <DIR>          Saved Games
23/06/2016  10:55    <DIR>          Searches
02/05/2016  12:36    <DIR>          SecurityScans
11/04/2016  12:14               994 Start Menu - Shortcut.lnk
31/05/2016  00:52    <DIR>          temp
17/03/2015  06:19    <DIR>          Videos
               1 File(s)            994 bytes
              19 Dir(s)  69,716,357,120 bytes free

หนีออกมาร้อยละ

%ตัวละครที่มีความหมายพิเศษสำหรับพารามิเตอร์บรรทัดคำสั่งและFORพารามิเตอร์

ในการถือว่าเปอร์เซ็นต์เป็นอักขระปกติให้เพิ่มเป็นสองเท่า:

%%

ไวยากรณ์ต้นฉบับ


อ่านเพิ่มเติม


1
หมายเหตุ:อักขระที่สงวนไว้บางตัวเท่านั้นที่ใช้กับระบบไฟล์ NTFS การใช้ลินุกซ์, <test>ตัวอย่างเช่นฉันสามารถสร้างไฟล์ชื่อ ไม่สามารถทำได้โดยใช้ฟังก์ชันการจัดการไฟล์ของ Windows
Nathan Osman

2
@NathanOsman คุณอาจสร้างไฟล์ด้วยชื่อเหล่านั้นจากภายใน Windows โดยใช้สัญกรณ์พา ธ แบบสัมบูรณ์พา ธ ( \\?\C:\USERS\DEFAULT\<test>)
zwol

@zwol โอ้ ฉันไม่รู้ เป็นเรื่องดีที่รู้
Nathan Osman

@zwol ไม่ใช่จากcmdเชลล์ ... F:\test>md \\?\f:\test\<test> ไวยากรณ์ของคำสั่งไม่ถูกต้อง
DavidPostill

@DavidPostill เกี่ยวกับmd \\^?\f:\test\^<test^>อะไร
zwol

11

คำตอบของ DavidPostill นั้นยอดเยี่ยม แต่อาจทำให้ผู้มาใหม่สับสนเล็กน้อย ฉันจะพยายามใช้ถ้อยคำใหม่

%ไม่ใช่ตัวละครที่สงวนไว้

มันเป็นตัวละครที่มีความหมายพิเศษกับคำสั่งเชลล์ (aka cmd.exeและcommand.com)

ความแตกต่างคือ:

  • คุณไม่สามารถใช้อักขระที่สงวนไว้เลย (แต่ดูด้านล่าง)
  • คุณอาจสามารถใช้อักขระพิเศษและอักขระยกเว้น - ได้โดยไม่ต้องพิมพ์ตามที่เป็น

กล่าวอีกนัยหนึ่งคุณสามารถสร้างไฟล์หรือโฟลเดอร์ที่มี%ชื่อของพวกเขา คุณสามารถทำได้โดยตรงโดยใช้ windows explorer เนื่องจาก%ไม่มีความหมายพิเศษ ไม่มีความตั้งใจที่จะป้องกันไม่ให้คุณสร้างไฟล์ดังกล่าวที่คอมมานด์พรอมต์ แต่เนื่องจาก%มีความหมายพิเศษที่นั่นคุณต้องใช้ไวยากรณ์ที่ระบุไว้ด้านล่างเพื่อสร้างไฟล์ดังกล่าว

BAT-ไฟล์

หากคุณกำลังเขียนไฟล์แบตช์ (* .bat, * .cmd) ซึ่งถูกเรียกใช้งานโดย command command (หรือที่รู้จักในแอพพลิเคชั่นพรอมต์คำสั่ง) เพื่อใช้งานอย่าง%แท้จริง (เช่นการสร้างไฟล์ด้วย%ในชื่อและไม่ต้องทดแทน ตัวแปรหรือพารามิเตอร์) คุณต้องพิมพ์%%แทน

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

  • คำสั่งecho %windir%ผลิตผลลัพธ์:c:\windows
  • อย่างไรก็ตามคำสั่งecho %%windir%%สร้างเอาต์พุต:%windir%
  • และอื่น ๆ : คำสั่งecho %%%%windir%%%%ผลิตผลลัพธ์:%%windir%%

ดังนั้นถ้าคุณบันทึกบรรทัดต่อไปนี้test.batและเรียกใช้มันจะสร้างไดเรกทอรีที่ชื่อ%test%สมบูรณ์ด้วยเครื่องหมายเปอร์เซ็นต์:

md %%test%%

หากไม่มีชื่อตัวแปรtestคำสั่งถัดไปนี้จะเทียบเท่ากับคำสั่งสุดท้าย - นอกจากนี้ยังสร้างไดเรกทอรี%test%:

md %test%

... แต่โปรดอย่าทำอย่างนั้นเนื่องจากคำสั่งของคุณจะไม่ทำงานตามที่คุณต้องการเมื่อมีคนสร้างตัวแปรด้วยชื่อนั้น

หากคุณตั้งใจจะใช้คำสั่งforในไฟล์ BAT คุณต้องเพิ่มเป็นสองเท่า%เพื่อให้มันมีความหมายพิเศษในการforสั่งแทนที่จะเป็นเชลล์คำสั่ง:

for %%i in (*.*) do echo %%i

สิ่งนี้จะสร้างรายการไฟล์ในไดเรกทอรีปัจจุบัน (นั่นคือ%%iมีความหมายพิเศษ) และฉันไม่แน่ใจว่าจะสร้างไฟล์ตามตัวอักษรได้อย่างไร%%iโดยไม่ต้องใช้%p%วิธีแก้ปัญหาที่อธิบายไว้ในส่วนถัดไป ( %%%%iไม่ทำงานที่นี่)

%ไม่ใช่อักขระเพียงตัวเดียวที่มีความหมายพิเศษที่พร้อมท์คำสั่ง อื่น ๆ รวมถึง^, <, >, |, (, ), &, ,! "ส่วนใหญ่ (ยกเว้น") สามารถหลบหนีได้ - กล่าวคือนำหน้าด้วยอักขระเลี่ยง^เพื่อแทรกอักขระตามตัวอักษรระงับความหมายพิเศษของมัน ผู้ที่ยังสูญเสียฟังก์ชั่นพิเศษของพวกเขาภายในสตริง doublequoted และรอดด้วยเครื่องหมายทับขวา:" \"คาร์เทตบางตัว ( ^) อาจต้องเพิ่มเป็นสองเท่าภายในสตริงที่มีเครื่องหมายคำพูดสองบรรทัดและจะมีการแทนที่ตัวแปรล่าช้า ( !ความหมายพิเศษ)

พร้อมรับคำสั่ง

น่าเสียดายที่เมื่อพิมพ์คำสั่งลงในหน้าต่างพรอมต์คำสั่งโดยตรง%ตัวละครสองเท่าจะสร้าง%%เช่นวิธีการข้างต้นไม่ทำงานในกรณีนั้น

มีปรากฏเป็นวิธีแก้ปัญหาการใช้ประโยชน์จากการเล่นโวหารในการประมวลผลคำสั่ง - คุณจะได้รับตัวอักษร%โดยพิมพ์หลังจากที่^ %วิธีการนั้นไม่สามารถจะเข้าใจผิดได้แม้ว่า: หากชื่อไฟล์ของคุณอยู่ในเครื่องหมายคำพูดคู่^จะถูกตีความอย่างแท้จริง (และไม่ถูกลบออกเหมือนไม่มีคำพูด)

  • คำสั่งecho %windir%ผลิตผลลัพธ์:c:\windows
  • คำสั่งecho %^windir%ผลิตผลลัพธ์:%windir%
  • คำสั่งecho "%^windir%"สร้างผลลัพธ์: "%^windir%"(พร้อมพิเศษ^- ไม่ใช่สิ่งที่เราต้องการ)

ฉันขอแนะนำวิธีแก้ปัญหาอื่นแทน:

  • สร้างตัวแปรเช่นนี้ set "p=%"
  • ใช้เมื่อ%p%ใดก็ตามที่คุณต้องการเครื่องหมายเปอร์เซ็นต์ที่แท้จริง: echo "%p%windir%p%"ตอนนี้จะสร้างผลลัพธ์:"%windir%"

วิธีแก้ปัญหาแบบเดียวกันนี้สามารถใช้เพื่อforรับคำสั่งเปอร์เซ็นต์การลงชื่อเข้าใช้อย่างแท้จริงอย่างไรก็ตามโปรดทราบว่าไม่เหมือนกับไฟล์ BAT เมื่อทำการคีย์forคำสั่งโดยตรงคุณจะไม่ได้รับเครื่องหมายเปอร์เซ็นต์สองเท่า

อักขระที่สงวนไว้สำหรับระบบไฟล์

ตามปกติคุณจะไม่สามารถสร้างไฟล์หรือไดเรกทอรีที่มีอักขระที่สงวนไว้ดังต่อไปนี้ในชื่อ: / ? < > \ : * | ", สัญลักษณ์ NULL และอักขระที่มีรหัส 1 ถึง 31; ยัง.และพื้นที่ไม่สามารถเป็นตัวละครที่ผ่านมา; และชื่อต่อไปนี้ผิดกฎหมาย: com1 com2 com3 com4 com5 com6 com7 com8 com9 lpt1 lpt2 lpt3 lpt4 lpt5 lpt6 lpt7 lpt8 lpt9 con nul prn.

แต่บางข้อ จำกัด เหล่านี้สามารถข้าม prefixing เส้นทางของไฟล์ที่มีเช่นนี้\\?\ \\?\c:\test...\nulอย่างน้อยไฟล์ที่มีชื่อที่สงวนไว้และไฟล์ที่ลงท้ายด้วย space และ dot สามารถจัดการได้

ยิ่งไปกว่านั้นระบบไฟล์ NTFS นั้นรองรับระบบย่อยหลายระบบเช่น DOS, Windows และ POSIX มันเป็นระบบย่อยของ Windows ที่มีข้อ จำกัด ทั้งหมดข้างต้นในขณะที่ POSIX ห้ามเพียง/และสัญลักษณ์ NULL เท่านั้น

GNU / Linux OS (ชุดย่อยของ POSIX) สามารถสร้าง (และลบ) ชื่อไฟล์ / ไดเรกทอรีที่ Windows API ส่วนใหญ่ทำงาน (และดังนั้นโปรแกรม windows) จึงไม่สามารถทำงานได้ ใน Windows XP สามารถทำงานกับมันได้โดยติดตั้ง "Services for Unix Subsystem" (SFU) ฟรี; บน Vista และเครื่องมือของบุคคลที่สามที่จำเป็นสำหรับการทำเช่นนั้น ฉันไม่แน่ใจว่าระบบย่อย ubuntu-on-windows10 ใหม่สามารถทำได้หรือไม่


ทำไมคุณใช้แท็กแป้นพิมพ์สำหรับชื่อพา ธ / คำสั่ง มันจะทั้งถูกต้องมากขึ้นและอ่านง่ายขึ้นถ้าคุณใช้การจัดรูปแบบโค้ดอินไลน์ นอกจากนี้ยังจะง่ายต่อการพิมพ์: backtick <kbd>แทน
Cody Gray

เสร็จแล้ว ผมคิดว่า <kbd> แท็ก </ kbd> code blocksมีโครงร่างที่ชัดเจนมากขึ้นกว่า แต่ถ้าคำถามดังกล่าวเกิดขึ้นฉันเดาว่าพวกเขาทำให้เกิดความสับสน
แจ็คไวท์

2
"มันเป็นสัญลักษณ์ยกเว้นของเชลล์คำสั่ง" ไม่ถูกต้อง ตัวหนีใน cmd ^คือ %คือ "อักขระที่มีความหมายพิเศษสำหรับพารามิเตอร์บรรทัดคำสั่งและพารามิเตอร์ FOR เมื่อต้องการจัดการเปอร์เซ็นต์เป็นอักขระปกติให้เพิ่มเป็นสองเท่า"
DavidPostill

อันที่จริงฉันมีข้อตกลงผสมกัน ตอนนี้แก้ไขคำตอบ ขอบคุณ
แจ็คไวท์

นอกจากนี้โปรดทราบว่าตามที่ระบุไว้ในคำตอบของฉันคุณจะเพิ่มเป็นสองเท่า%ในforกรณีที่forอยู่ในไฟล์แบตช์ พิมพ์ดีดfor %%i in (*) do echo %%iในหน้าต่างคำสั่ง propmt %%iผลิตข้อผิดพลาดที่อ้างถึงการปรากฏตัวของ
แจ็คไวท์
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.