batch-file - 如何在批处理文件中转义波形符 (~),并将其替换为其他字符?

标签 batch-file cmd

该脚本可以将文件名中的某些字符替换为指定字符,但不适用于波形符 ~

下面两个部分工作正常。

@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/

相关文章:

windows - 如何撤消 Windows 上的最后一个 cd 命令?

PHP exec 使用 IIS 更改 Windows 密码

Windows 批处理 : formatted date into variable

java - 将批处理文件作为计划任务运行时出错,Windows Server 2008

powershell - Windows 相当于 efibootmgr?

windows - "edit"不是 cmd.exe 中的有效命令?

java - 从命令提示符编译 J2ME

batch-file - 如何在命令提示符下更改控制台中的字符?

windows - 批处理文件变量覆盖

windows - 转义批处理脚本变量中的引号