[英]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.