我有一个名为的文件 - 例如:01_XXXXXXXX_XXXX_XXX.txt
。
我需要删除前三个字符(不用替换01_
)并将剩余的_
替换为 SPACEs 。
我无法使用PowerShell,我需要一个简单的.bat
文件来循环遍历它所在目录中的所有文件,并执行此任务。
所以我正在使用它:
@echo off
setlocal enabledelayedexpansion
for %%a in (*_*) do (
set file=%%a
ren "!file!" "!file:_= !"
)
@echo off
setlocal enabledelayedexpansion
set X=2
for %%f in (*) do if %%f neq %~nx0 (
set "filename=%%~nf"
set "filename=!filename:~%X%,-%X%!"
ren "%%f" "!filename!%%~xf"
)
popd
但是在扩展之前最后吃了两个字符,并在开头添加了 SPACE 。
知道为什么吗?
答案 0 :(得分:2)
您正在分割前两个和后两个字符,因为您错误地实施了sub-string expansion syntax。领先的 SPACE 来自替换前的第一个_
。
以下显示了一种可靠的方法,仅使用单个循环和sub-string replacement syntax,第一次在*
之后立即使用:
,告诉命令行解释器替换所有内容,包括第一次出现的搜索字符串:
@echo off
setlocal EnableExtensions DisableDelayedExpansion
for %%A in ("*_*") do (
rem // Store current item:
set "FILE=%%~A"
rem // Toggle delayed expansion to avoid loss of or trouble with `!`:
setlocal EnableDelayedExpansion
rem // Remove everything up to and including the first `_`:
set "FNEW=!FILE:*_=!"
rem // Replace every remaining `_` by ` `:
ren "!FILE!" "!FNEW:_= !"
endlocal
)
endlocal
exit /B
答案 1 :(得分:1)
如果您的模式与01_XXXXXXXX_XXXX_XXX.txt
一致(即不需要的字符串以_
结尾,后跟三个必需字符串,以_
分隔),那么一个像这样的班轮就足够了:
从批处理文件:
@For /F "Tokens=1-4 Delims=_" %%A In ('Where ?*_?*_?*_?*.txt') Do @If Not Exist "%%B %%C %%D" @Ren "%%A_%%B_%%C_%%D" "%%B %%C %%D"
从命令提示符:
For /F "Tokens=1-4 Delims=_" %A In ('Where ?*_?*_?*_?*.txt') Do @If Not Exist "%B %C %D" @Ren "%A_%B_%C_%D" "%B %C %D"