gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 16:54:45 26 4
gpt4 key购买 nike

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

下面两个部分工作正常。

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

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com