2013-01-24 186 views
54

我最近包括在.cmd文件類似這樣的一行:cmd文件中%和%%有什麼區別?

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

我原本只是用來%F,當通過文件運行時,在命令行上來看,它做工精細,但不。當我切換到%% f時,它在文件中工作。只是想知道有什麼不同。

回答

86

(更詳細解釋可以在this 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 
+14

有爲什麼我可以在僅使用一個百分號FOR循環跑不掉的解釋,直接從命令提示符執行,而不是從批處理文件執行?我知道DOS遺產,但我們可以**現在使用命令行中的變量。 –

+3

另外,確保變量是單個字符。 – jiggunjer

10

在DOS中,您不能在命令行上使用環境變量,只能在批處理文件中使用%符號作爲分隔符。如果您想在批處理文件中輸入文字%,例如在echo聲明中,您需要將其加倍。

這繼承了Windows NT,允許在命令行上使用環境變量,但爲了向後兼容,您仍然需要將.cmd文件中的%符號加倍。