该脚本可以将文件名中的某些字符替换为指定字符,但不适用于波形符 ~
。
下面两个部分工作正常。
@echo off
setlocal enabledelayedexpansion
for %%a in (*_*) do (
set file=%%a
ren "!file!" "!file:_=A!"
)
for %%a in (*-*) do (
set file=%%a
ren "!file!" "!file:-=B!"
)
但这部分不起作用。
for %%a in (*~*) do (
set file=%%a
ren "!file!" "!file:~=C!"
)
为什么替换~
不起作用以及如何解决这个问题?
最佳答案
您正在使用sub-string substitution语法(如 !file:search=replac!
),不允许搜索字符串以 ~
开头,因为这样会与 sub-string expansion 混淆。语法(如 !file:~pos,len!
)。
你可以做的是使用for /F
在 ~
字符处分割文件名:
for /F "tokens=1* delims=~ eol=~" %%I in ('dir /B /A:-D "*~*"') do (
if not "%%J" == "" ren "%%I~%%J" "%%IC%%J"
)
仅当存在单个 ~
字符并且该字符不在第一个位置时才有效。
如果任意位置有多个 ~
字符,就会变得有点复杂:
@echo off
for /F "delims= eol=|" %%F in ('dir /B /A:-D "*~*" ^| find "~"') do (
set "FILE=%%F" & set "EXT=%%~xF"
call :SUB NAME "%%~nF" C
setlocal EnableDelayedExpansion
ren "!FILE!" "!NAME!!EXT!"
endlocal
)
exit /B
:SUB
set "#RET=%~1"
set "STR=%~2"
set "CHR=%~3"
set "LEFT=" & set "REST="
if not defined STR goto :NEXT
:LOOP
set "REST=%STR:*~=%"
if "%REST%" == "%STR%" goto :NEXT
for /F "delims=~ eol=~" %%E in ("_%STR%") do set "LEFT=%%E"
set "STR=%LEFT:~1%%CHR%%REST%"
goto :LOOP
:NEXT
set "%#RET%=%STR%"
exit /B
子例程:SUB
在循环中的每个~
处分割文件名字符串,并通过用指定的替换~
来重建它性格。
过滤器|需要 find "~"
(以及第一种方法中的 if not "%%J"== ""
条件),因为 dir
也匹配short file names ,通常包含 ~
字符。如果您的系统上禁用了此类 8.3 文件名,则这些附加代码部分可能会被删除(尽管它们不会造成损害)。
关于batch-file - 如何在批处理文件中转义波形符 (~),并将其替换为其他字符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57610104/