有許多差異命令在cmd
或批處理文件上下文是否被執行時,所有這些參考cmd
-internal命令或雖然功能。
當cmd
上下文中執行的是什麼也不做(它們不產生任何輸出,並且不影響ErrorLevel
)以下命令:
goto
shift
setlocal
(以烯/禁用命令擴展或延遲擴展cmd
,而不是使用cmd /E:{ON|OFF} /V:{ON|OFF}
來調用實例)
endlocal
標籤(如:Label
)不能用於cmd
,它們被簡單忽略。因此,call :Label
也不能使用(如果這樣做,則會顯示錯誤消息,ErrorLevel
將設置爲1
)。
cmd
當然沒有argument expansion,因爲沒有可能提供參數。因此像%1
這樣的字符串就像原樣返回(嘗試使用echo %1
)。這允許在cmd
中定義以數字開頭的變量名,這在批處理文件中是不可能的(實際上,您可以定義它們,但不能在%
中展開它們;請在批處理文件中嘗試此操作:set "123=abc"
,然後set 1
;將獲得輸出123=abc
;但試圖執行echo %123%
將導致輸出23
,因爲%1
被識別爲參數引用(假定沒有參數提供))。
未定義的環境變量沒有在cmd
擴展(替代),但他們是從字面上保持(做set "VAR="
和echo %VAR%
,所以你得到%VAR%
)。但是,在批處理文件中,它們被擴展爲空字符串。請注意,在批處理文件中但不在cmd
中,連續兩個百分號%%
被替換爲單個%
。也在批處理文件中,但不在cmd
中,單個%
符號將被刪除。
大約百分膨脹(包括參數的引用和環境變量)的更多信息可以在這個線程中找到:How does the Windows Command Interpreter (CMD.EXE) parse scripts?
的set /A
命令表現不同:在cmd
它返回對錶達式的(最後的)結果控制檯(沒有尾隨換行符),但是在批處理文件中它不會返回任何東西。
的for
命令需要其循環變量的引用由兩個百分比符號(如for %%I in ...
)在批處理文件中被preceeded,但只有單一的一個(像for %I in ...
)在cmd
。這是批處理文件和cmd
中擴展處理百分比不同的結果。
最後,某些命令在成功時不會重置ErrorLevel
,除非它們在擴展名爲.cmd
的批處理文件中使用。它們是:
assoc
dpath
ftype
path
prompt
set
有關資源的更多信息在這篇文章中可以找到ErrorLevel
:Which cmd.exe internal commands clear the ERRORLEVEL to 0 upon success?
首先,引用此線程:[Windows命令解釋器(CMD.EXE)如何解析腳本?](http://stackoverflow.com/questions/4094699/如何執行windows-command-interpreter-cmd-exe-parse-scripts/4095133) – aschipfl
快速回復我的頭腦:某些命令在'cmd'中不起作用:'goto','shift','setlocal ','endlocal'和'call:Label'; ; 'set/A'將(最後一個)結果寫入'cmd'中的控制檯,但不是批處理文件;沒有[參數擴展](http://ss64.com/nt/syntax-args.html);未定義的環境變量擴展爲批處理文件中的空字符串,但在'cmd'中保持原狀; '%%'在批處理文件中成爲文字'%',但不在'cmd'中;這就是爲什麼你必須在批處理文件中聲明'for %% I in ...',而''在'cmd'中聲明%I ... ...';和一些命令可能會或可能不會重置'ErrorLevel' ... – aschipfl
@aschipfl:感謝您的鏈接,這似乎是一個好的開始。難怪我沒有通過搜索找到它,我不會通過閱讀標題猜到它包含我正在尋找的東西。 – Thomas