![](/img/trans.png)
[英]Windows batch: parse path/filename, testing for file vs. directory?
[英]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.