ความแตกต่างระหว่าง% และ %% ในไฟล์ cmd คืออะไร?


88

ฉันเพิ่งรวมบรรทัดที่คล้ายกับสิ่งนี้ในไฟล์. cmd:

for /f %%f in ('dir /b .\directory\*.sql') DO sqlcmd -b -o ".\directory\output\%%f.txt" -i ".\directory\%%f"

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

คำตอบ:


138

(คำอธิบายรายละเอียดเพิ่มเติมสามารถพบได้ในบทความ Microsoft KB ที่เก็บถาวร )

สามสิ่งที่ควรรู้:

  1. เครื่องหมายเปอร์เซ็นต์จะใช้ในไฟล์ชุดเพื่อเป็นตัวแทนของพารามิเตอร์บรรทัดคำสั่ง%1, %2...
  2. เครื่องหมายสองเปอร์เซ็นต์ที่มีอักขระใด ๆ คั่นระหว่างเครื่องหมายเหล่านี้จะถูกตีความเป็นตัวแปร:

    echo %myvar%

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

ทำไมเป็นอย่างนั้น?

ตัวอย่างเช่นหากเราเรียกใช้บรรทัดคำสั่ง (แบบง่าย) ของคุณ

FOR /f %f in ('dir /b .') DO somecommand %f

ในไฟล์แบตช์กฎ 2จะพยายามตีความ

%f in ('dir /b .') DO somecommand %

เป็นตัวแปร เพื่อป้องกันสิ่งนั้นคุณต้องใช้กฎข้อ 3และหลีกหนี%ข้อที่สอง%:

FOR /f %%f in ('dir /b .') DO somecommand %%f

21
มีคำอธิบายหรือไม่ว่าเหตุใดฉันจึงสามารถใช้การลงชื่อเพียงหนึ่งเปอร์เซ็นต์ในลูป FOR เมื่อดำเนินการโดยตรงจากพรอมต์คำสั่งไม่ใช่จากไฟล์แบตช์ ฉันรู้เกี่ยวกับมรดก DOS แต่ตอนนี้เราสามารถใช้ตัวแปรจากบรรทัดคำสั่งได้แล้ว
Alec Mev

6
ตรวจสอบให้แน่ใจว่าตัวแปรเป็นอักขระเดี่ยว
jiggunjer

1
จะเกิดอะไรขึ้นถ้าฉันต้องการออกคำสั่งที่มี% อยู่เช่น: for / f %% i in ('git log -1 --pretty = format: "%% H"') ให้ตั้งค่า GIT_COMMIT = %% i
Wakan Tanka

15

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

สิ่งนี้นำไปสู่ ​​Windows NT ซึ่งอนุญาตให้ใช้ตัวแปรสภาพแวดล้อมในบรรทัดคำสั่งอย่างไรก็ตามสำหรับความเข้ากันได้แบบย้อนกลับคุณยังคงต้องเพิ่ม%สัญญาณของคุณเป็นสองเท่าในไฟล์. cmd

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