繁体   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