我正在寻找在Windows cmd窗口中运行完全相同的代码(逐行手动输入)与编写批处理文件并运行它之间的差异的完整列表。
我不可能成为第一个问这个问题的人,但Google和多个堆栈溢出搜索都没有返回我想要的内容。我主要通过.bat & .cmd喜欢这个,或specific questions关于a single issue进行比较。我知道还有其他差异,例如我刚发现
set "filename=foo"
set "optional_postfix="
set "filetype=.cpp"
set completename=%filename%%optional_postfix%%filetype%
echo %completename%
PAUSE
行为不同。
我想了解所有差异,因为在尝试了应该工作半小时之后发现它们之后发现它们并且发现之后的差异非常烦人。
如果此处已存在此类列表,请不要低估我,我实际上花时间寻找它 - 至少对我来说 - 如何找到它并不明显。其他人可能会有同样的问题,所以请将其标记为重复。
答案 0 :(得分:1)
在cmd
或批处理文件上下文中执行命令有很多不同之处,所有这些命令都引用cmd
- 内部命令或功能。
以下命令在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}被识别为参数引用(假设没有提供参数))。
%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 ...
中只有一个(如for %I in ...
)前面1}}。这是批处理文件和cmd
中不同百分比扩展处理的结果。
最后,某些命令在成功时不会重置cmd
,除非它们在具有ErrorLevel
扩展名的批处理文件中使用。这些是:
.cmd
assoc
dpath
ftype
path
prompt
有关重置set
的详细信息,请参阅此帖:Which cmd.exe internal commands clear the ERRORLEVEL to 0 upon success?