在 .bat 脚本中保存字符串变量时出现问题

Posted

技术标签:

【中文标题】在 .bat 脚本中保存字符串变量时出现问题【英文标题】:Problem saving string variables in .bat script 【发布时间】:2022-01-07 15:48:30 【问题描述】:

正如标题所说,我在 bat 脚本中保存(并因此打印)字符串变量时遇到问题。当我尝试使用以“!”开头和/或结尾的字符串时,就会出现问题。示例:

@echo off
pause
setlocal ENABLEDELAYEDEXPANSION
for /r %%f in (*.png *.jpg *.gif *.webp *.jpeg) do (

set curr_name=%%~nxf
set curr_path=%%~dpf

@echo !curr_path!!curr_name!

@echo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
)
pause

对于名为 !a.pnga!.png 的文件,它会打印出 a.png!a! .png 它只是打印出 .png。我一直试图为此找到答案,但没有运气。抱歉,如果我在这里遗漏了一些明显的东西,并感谢您的任何提示!

【问题讨论】:

【参考方案1】:

启用延迟扩展后,这是预期行为。您显示的用例不需要分配变量 - 您可以使用相关的 For 变量修饰符。

如果由于某种原因需要使用延迟扩展(例如执行子字符串修改),则应在分配变量后的循环期间打开/关闭延迟扩展:

例子:

@echo off

 for /r %%f in (*.png *.jpg *.gif *.webp *.jpeg) do (
  set "curr_name=%%~nxf"
  set "curr_path=%%~dpf"
  Setlocal enabledelayedexpansion
  echo(!curr_path!!curr_name!
  endlocal
  @echo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 )

pause

【讨论】:

我发布的示例是完整脚本的内脏部分,我确实需要在这个 for 循环的外部和内部进行延迟扩展。您是否建议使用 setlocal enabledelayedexpansion/endlocal 包装每个需要它的部分? 这将取决于我们看不到的“内脏”代码的其余部分。为整个脚本启用它通常会很好,只要您不需要使用包含感叹号的字符串,否则,启用它并仅在需要时使用它。

以上是关于在 .bat 脚本中保存字符串变量时出现问题的主要内容,如果未能解决你的问题,请参考以下文章

保存非英文字符时出现问题

在数据库中保存表情符号时出现奇怪的字符。这是正常的吗?

在bash脚本中重定向到文件时出现奇怪的字符[重复]

在参数中添加变量时出现语法错误

在.bat脚本中如何将一个命令的返回结果传给一个变量?

Shell基本脚本命令使用教程