批处理:如何在变量中替换%符号?

时间:2017-06-30 21:41:35

标签: batch-file escaping invalid-characters

我尝试重命名我的文件,以删除导致脚本出现问题的所有字符。这适用于&符号和感叹号,但是当文件具有百分号时,它不会显示在变量中。如何通过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%"

2 个答案:

答案 0 :(得分:1)

可能的方法是使用delayed expansion

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

endlocal

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

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

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

答案 1 :(得分:1)

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

您应该将值保存到变量中,并在函数中访问这些变量。

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!"