通过.bat替换文件名中的字符

时间:2017-01-03 15:19:40

标签: batch-file cmd

我有一个名为的文件 - 例如: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

知道为什么吗?

2 个答案:

答案 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"