【问题标题】:Should I always enable delayed expansion for a whole batch script?我是否应该始终为整个批处理脚本启用延迟扩展?
【发布时间】:2021-06-20 22:24:48
【问题描述】:

我是否应该始终将setlocal enableDelayedExpansion 放在批处理脚本的开头,即使我不需要它?

它对性能有什么影响,还是会引起什么问题?

【问题讨论】:

  • 每个脚本都不需要延迟扩展,处理包含!感叹号的路径或字符串时需要考虑。
  • 不,你不应该。只有在真正需要时才应启用延迟扩展,因为它会导致对每个命令行进行双重解析,并导致文件/文件夹名称或其他包含感叹号的字符串出现问题。出于这个原因,setlocal enableDelayedExpansion 应该只在真正需要并且知道文件/文件夹名称和其他字符串中与! 相关的后果时使用。我建议阅读 this answer 的 issue 章节,了解有关如何编写批处理文件的一般提示。
  • 双重解析,但不是双重执行。我将成为异议的声音,并说处理包含! 的文件名确实是不延迟扩展的唯一原因,除此之外,我想不出一个不这样做的其他原因.和空格一样,感叹号也不应该出现在文件名中。

标签: batch-file


【解决方案1】:

我几乎总是在任何批处理文件的开头启用延迟扩展。

因为它有两个主要优点:

  • !varname! 的扩展是在执行表达式时评估的,而不是在解析时评估,例如百分比扩展,这样可以避免很多问题
  • 扩展的内容始终是安全的,不会被进一步(重新)解析,特殊字符不会造成伤害
  • setlocal 可防止局部变量污染环境

唯一的缺点是感叹号本身的处理。
但即使这样也可以通过一些胶水代码来解决

【讨论】:

  • 最近我发现enableddelayedexpansion 也可以批量处理数组,比如set /a integer_%index%=100echo int_%index% = !integer_%index%!。太令人兴奋了。
猜你喜欢
  • 2021-01-09
  • 2018-11-25
  • 1970-01-01
  • 2017-12-10
  • 2012-05-20
  • 1970-01-01
  • 1970-01-01
  • 2020-08-05
  • 2013-02-02
相关资源
最近更新 更多