批处理:如何替换变量中的 % 符号?
Batch: How to replace % sign within a variable?
我正在尝试重命名我的文件以删除任何导致脚本出现问题的字符。这对 & 符号和感叹号很有效,但是当文件有百分号时,它不会出现在开头的变量中。如何通过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%"
一种可能的方法是使用 delayed expansion:
set "newfilename=%filename:&=and%"
setlocal EnableDelayedExpansion
set "newfilename=!newfilename:%%= percent!"
endlocal
%
符号必须通过在批处理文件中加倍来转义。
请注意,该变量在 endlocal
命令之后不再可用。
我使用了引用语法,这是定义变量的最安全方式,即使使用空格和特殊字符也是如此。
您的问题是行 for %%v in (*) do call :validate "%%v", because the
call` 第二次启动解析器,所有百分比都被第二次计算。
您应该将该值保存到一个变量中,然后在您的函数中访问这些变量。
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!"
我正在尝试重命名我的文件以删除任何导致脚本出现问题的字符。这对 & 符号和感叹号很有效,但是当文件有百分号时,它不会出现在开头的变量中。如何通过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%"
一种可能的方法是使用 delayed expansion:
set "newfilename=%filename:&=and%"
setlocal EnableDelayedExpansion
set "newfilename=!newfilename:%%= percent!"
endlocal
%
符号必须通过在批处理文件中加倍来转义。
请注意,该变量在 endlocal
命令之后不再可用。
我使用了引用语法,这是定义变量的最安全方式,即使使用空格和特殊字符也是如此。
您的问题是行 for %%v in (*) do call :validate "%%v", because the
call` 第二次启动解析器,所有百分比都被第二次计算。
您应该将该值保存到一个变量中,然后在您的函数中访问这些变量。
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!"