Sự khác biệt giữa% và %% trong tệp cmd là gì?


87

Gần đây tôi đã bao gồm một dòng tương tự như dòng này trong tệp .cmd:

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

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

Câu trả lời:


136

(Giải thích chi tiết hơn có thể được tìm thấy trong một bài viết Microsoft KB được lưu trữ .)

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. Dấu hai phần trăm với bất kỳ ký tự nào ở giữa chúng được hiểu là một biến:

    echo %myvar%

  3. Hai dấu phần trăm không có bất kỳ thứ gì ở giữa (trong một tệp lô) được coi như một dấu phần trăm duy nhất trong một lệnh (không phải tệp lô):%%f

Tại sao vậy?

Ví dụ: nếu chúng tôi thực hiện dòng lệnh (đơn giản hóa) của bạn

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

trong một tệp hàng loạt, quy tắc 2 sẽ cố gắng diễn giải

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

như 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 quy tắc% thứ hai %:

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

21
Có lời giải thích cho lý do tại sao tôi có thể thoát khỏi chỉ bằng một dấu phần trăm trong vòng lặp FOR, khi được thực thi trực tiếp từ dấu nhắc lệnh, chứ không phải từ tệp lô không? Tôi biết về di sản DOS, nhưng bây giờ chúng ta có thể sử dụng các biến từ một dòng lệnh.
Alec Mev 29/10/13

6
Ngoài ra, hãy đảm bảo rằng biến là một ký tự duy nhất.
jiggunjer

1
Điều gì sẽ xảy ra nếu tôi muốn đưa ra lệnh có% trong đó, ví dụ: for / f %% i in ('git log -1 --pretty = format: "%% H"') do set GIT_COMMIT = %% i
Wakan Tanka

15

Trong DOS, bạn không thể sử dụng các biến môi trường trên dòng lệnh, chỉ trong các tệp hàng loạt, nơi chúng sử dụng %dấu hiệu làm dấu phân cách. Nếu bạn muốn có một ký tự %trong một tệp loạt, ví dụ như trong một echocâu lệnh, bạn cần phải nhân đôi nó.

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

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.