2013-01-24 28 views
54

Gần đây tôi đã bao gồm một dòng tương tự như sau trong một file .cmd:Sự khác biệt giữa% và %% trong một tệp cmd là gì?

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

Nguyên tôi đã chỉ được sử dụng% f, và nó sẽ làm việc tốt khi chạy trên dòng lệnh, nhưng không phải khi chạy qua các tập tin . Khi tôi chuyển sang %% f, nó hoạt động trong tệp. Chỉ cần tự hỏi sự khác biệt là gì.

Trả lời

86

(. Giải thích chi tiết hơn có thể được tìm thấy trong this Microsoft kb)

Ba điều cần biết:

  1. Các ký hiệu phần trăm được sử dụng trong các tập tin batch để đại diện cho các tham số dòng lệnh: %1, %2 , ...
  2. Hai dấu phần trăm có bất kỳ ký tự nào ở giữa chúng được hiểu là biến:

    dấu hiệu

    echo %myvar%

  3. Hai trăm mà không bất cứ điều gì ở giữa (trong một tập tin batch) đều được đối xử như một dấu hiệu duy nhất phần trăm trong một lệnh (không phải là một tập tin thực thi): %%f

Tại sao là cái đó?

Ví dụ, nếu chúng ta thực hiện của bạn dòng (giản thể) lệnh

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

trong một tập tin thực thi, quy tắc 2 sẽ cố gắng để giải thích

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

như là một biến. Để ngăn chặn điều đó, bạn phải áp dụng quy tắc 3 và thoát khỏi % với một thứ hai %:

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

Có một lời giải thích cho lý do tại sao tôi có thể nhận được ngay với chỉ sử dụng một ký hiệu phần trăm trong một for loop, khi được thực thi trực tiếp từ dấu nhắc lệnh, chứ không phải từ tệp batch? Tôi biết về di sản DOS, nhưng chúng tôi ** có thể ** sử dụng các biến từ một dòng lệnh ngay bây giờ. –

+3

Ngoài ra, hãy đảm bảo biến là một ký tự đơn. – jiggunjer

10

Trong DOS, bạn không thể sử dụng biến môi trường trên dòng lệnh, chỉ trong tệp lô, trong đó họ sử dụng dấu % làm dấu phân cách. Nếu bạn muốn có một ký hiệu bằng chữ số % theo nghĩa đen, ví dụ: trong một tuyên bố echo, bạn cần phải tăng gấp đôi nó.

Điều này được chuyển sang Windows NT cho phép biến môi trường trên dòng lệnh, tuy nhiên đối với khả năng tương thích ngược, bạn vẫn cần phải tăng gấp đôi các dấu hiệu % trong tệp .cmd.

Các vấn đề liên quan