2017-06-14 45 views
0

我正在尋找在Windows cmd窗口中運行完全相同的代碼(手動輸入,逐行輸入)與寫作之間差異的完整列表一個批處理文件並運行它。綜合列表 - 在批處理文件中運行代碼與直接將代碼輸入到控制檯中

我不可能是第一個問這個問題的人,但Google和多個堆棧溢出搜索都沒有返回我想要的東西。我主要得到這樣的.bat & .cmd之間的比較,或specific questionsa single issue。我知道還有其他的差異,例如我剛剛發現,

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

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

行爲不同。

我想了解所有的差異,因爲在嘗試了半個小時之後發現他們的差異,應該工作和發現後的差異是相當惱人的。

如果這樣的列表已經存在,請不要低估我,我真的花時間去尋找它 - 至少對我而言 - 如何找到它並不明顯。其他人可能會遇到同樣的問題,所以請將其標記爲重複。

+1

首先,引用此線程:[Windows命令解釋器(CMD.EXE)如何解析腳本?](http://stackoverflow.com/questions/4094699/如何執行windows-command-interpreter-cmd-exe-parse-scripts/4095133) – aschipfl

+0

快速回復我的頭腦:某些命令在'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

+0

@aschipfl:感謝您的鏈接,這似乎是一個好的開始。難怪我沒有通過搜索找到它,我不會通過閱讀標題猜到它包含我正在尋找的東西。 – Thomas

回答

1

有許多差異命令在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

有關資源的更多信息在這篇文章中可以找到ErrorLevelWhich cmd.exe internal commands clear the ERRORLEVEL to 0 upon success?

相關問題