首页 > 解决方案 > 如何使用批处理脚本从文件名中提取子字符串?

问题描述

我有数百个文件要重命名以匹配新约定。当前约定是 AA.BBBB.XXX 我想将其更改为 BBBB.AA.XXX

我已经 cd'd 进入包含所有这些文件的文件夹。我想我可以简单地遍历文件并获取重建文件名所需的子字符串。问题是 %name% 在回显时似乎是空的。

for %%f in (*) do (
    set name=%%f
    set arr=%name:~0,3%
    set sta=%name:~3,5%
    set rest=%name:~8,26%
    set new=%sta%%arr%%rest%
    echo f: %%f
    echo name: %name%
    echo arr: %arr%
    echo sta: %sta%
    echo rest: %rest%
    echo new: %new%
    set
    pause
)

正如你在底部看到的那样,我称之为“set”,所以我可以看到这些变量发生了什么。它显示 %name% 等于我的预期,但在回显时显示为空,并且我的其他变量分配无法从 %name% 中提取子字符串。

标签: batch-file

解决方案


如果您的约定中的点是字面的,
您可以使用它们将名称与 a 分开for /f并重新排序各个部分。

编辑:由于Compos的提示更改了迭代以使用 RegEx 检查约定

:: Q:\Test\2019\05\23\SO_56266054.cmd
@Echo off
PushD "A:\Test"

For /f "delims=" %%F in ('Dir /B "??.????.*"^|findstr "^..\.....\.*"'
  ) do For /F "tokens=1,2*delims=." %%A in ("%%F"
    ) Do Echo Ren "%%F" "%%B.%%A.%%C"

PopD

如果输出看起来正常,请删除回声。

样本输出:

> Q:\Test\2019\05\23\SO_56266054.cmd
Ren "AA.BBBB.XXX" "BBBB.AA.XXX"
Ren "CC.DDDD.YYYY" "DDDD.CC.YYYY"
Ren "EE.FFFF.ZZZZZ" "FFFF.EE.ZZZZZ"

推荐阅读