【问题标题】:Batch: How to replace % sign within a variable?批处理:如何替换变量中的 % 符号?
【发布时间】:2017-06-30 21:41:34
【问题描述】:

我正在尝试重命名我的文件以删除任何会导致脚本出现问题的字符。这适用于&符号和感叹号,但当文件有百分号时,它不会显示在变量开头。如何通过for循环传递带有特殊字符的文件?

for %%v in (*) do call :validate "%%v"
exit /b

:validate
set "original=%~nx1"
set "newtitle=%original:!=%"
set "newtitle=%newtitle:&=and%"
setlocal enabledelayedexpansion
set "newtitle=!newtitle:%%= percent!"
if not "%newtitle%"=="%original%" ren %1 "%newtitle%"

【问题讨论】:

  • 你见过这种语法吗? Set "Var=String"
  • 是的,为什么?它没有帮助。
  • 还是没有。使用 %% 生成的变量为空,使用 ^% 保持不变。
  • @Johnny,我建议您将其用作良好做法。
  • 尝试使用setlocal enabledelayedexpansion启用延迟扩展,然后使用set foo=!bar:%%= percent!

标签: batch-file escaping invalid-characters


【解决方案1】:

您的问题是 for %%v in (*) do call :validate "%%v", because thecall 行第二次启动解析器,并且所有百分比都被第二次评估。

您应该将值保存到一个变量中,然后在您的函数中访问这些变量。

setlocal DisableDelayedExpansion
for %%v in (*) do (
  set "filename=%%~v"
  call :validate
)
exit /b

:validate
setlocal EnableDelayedExpansion
set "original=!filename!"
set "newtitle=%original:!=exclam%"
set "newtitle=!newtitle:&=and!"
set "newtitle=!newtitle:%=percent!"

【讨论】:

  • 这行得通,谢谢!我正在这里学习好东西。顺便说一句,如果我想将括号内的部分构建成一行,这意味着什么?只是不悦吗?
  • @JohnnyRogers 你的意思是set "filename=%%~v" & call :validate?它有效,但没有任何优势。而且更难阅读
  • 好的,罗杰。
【解决方案2】:

一种可能的方式是使用delayed expansion:

set "newfilename=%filename:&=and%"
setlocal EnableDelayedExpansion
set "newfilename=!newfilename:%%= percent!"

endlocal

%-符号必须通过在批处理文件中加倍来转义。

请注意,该变量在endlocal 命令之外不再可用。

我使用了带引号的语法,这是定义变量的最安全方法,即使使用空格和特殊字符也是如此。

【讨论】:

    猜你喜欢
    • 2022-06-15
    • 1970-01-01
    • 2018-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多