簡體   English   中英

綜合列表-在批處理文件中運行代碼與直接在控制台中輸入代碼

[英]Comprehensive list - Running code in batch file vs. entering code directly into console

我正在尋找在Windows cmd窗口中運行完全相同的代碼(逐行手動輸入)與編寫批處理文件並運行該代碼之間的差異的綜合列表。

我可能不是最先問這個問題的人,但是Google和多次堆棧溢出搜索都沒有返回我想要的結果。 我主要是比較.bat和.cmd這樣的比較,或者有關單個問題的 特定 問題 我知道還有其他差異,例如我剛剛發現

set "filename=foo"
set "optional_postfix="
set "filetype=.cpp"

set completename=%filename%%optional_postfix%%filetype%
echo %completename%
PAUSE

表現不同。

我想閱讀所有差異,因為嘗試了半小時后應該能找到答案,然后再找出差異是很煩人的。

如果這里已經存在這樣的列表,請不要對我投票,我實際上是花時間尋找它,並且-至少對我來說-如何找到它並不明顯。 其他人可能有相同的問題,因此請將其標記為重復。

有許多不同的命令是否執行cmd或批處理文件背景,所有這些均指cmd -internal命令或雖然功能。

以下命令在cmd上下文中執行時不執行任何操作(它們不會產生任何輸出並且不會影響ErrorLevel ):

  • goto
  • shift
  • setlocal (要在cmd啟用/禁用命令擴展或延遲擴展,請改用cmd /E:{ON|OFF} /V:{ON|OFF}調用實例)
  • endlocal

標簽(如:Label )不能在cmd ,它們只會被忽略。 因此,也無法使用call :Label (如果執行此操作,則會出現錯誤消息,並且ErrorLevel設置為1 )。

當然, cmd不會進行參數擴展 ,因為不可能提供參數。 因此,僅按原樣返回類似%1的字符串(嘗試使用echo %1 )。 這允許在cmd中定義以數字開頭的變量名,這在批處理文件中是不可能的(實際上,您可以定義它們,但不能%展開它們;請在批處理文件中嘗試以下操作: set "123=abc" ,然后set 1 ;您將獲得輸出123=abc ;但是嘗試執行echo %123%將導致輸出23 ,因為%1被識別為參數引用(假設未提供任何參數)。

未定義的環境變量不會在cmd展開(替換),而是按字面意義進行維護( set "VAR="echo %VAR% ,這樣您就可以獲得%VAR% )。 但是,在批處理文件中,它們會擴展為空字符串。 請注意,在批處理文件而不是在cmd ,連續兩個百分號%%是由一個單一的一個替代% 同樣在批處理文件中,但在cmd卻沒有,單個%符號將被刪除。

有關擴展百分比(參數引用和環境變量)的更多信息,可以在此線程中找到: Windows命令解釋器(CMD.EXE)如何解析腳本?

set /A命令的行為有所不同:在cmd它返回控制台上表達式的(最后)結果(不帶尾隨換行符),但是在批處理文件中,它不返回任何內容。

for命令要求其循環變量引用在批處理文件中以兩個百分號開頭(例如, for %%I in ... ),但在cmd僅一個(例如, for %I in ... )。 這是批處理文件和cmd擴展處理百分比不同的結果。

最后,除非成功在帶有.cmd擴展名的批處理文件中使用某些命令,否則它們不會在成功時重置ErrorLevel 這些是:

  • assoc
  • dpath
  • ftype
  • path
  • prompt
  • set

有關重置ErrorLevel更多信息,可以在這篇文章中找到: 哪些cmd.exe內部命令在成功后將ERRORLEVEL清除為0?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM