如何使用批处理脚本从文件名中提取子字符串?

时间:2019-05-22 23:03:02

标签: batch-file

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

我已经进入包含所有这些文件的文件夹。 我以为我可以简单地遍历文件并获取重建文件名所需的子字符串。问题在于,%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%提取子字符串。

3 个答案:

答案 0 :(得分:1)

如果约定中的点是字面意义,
您可以使用它们用for /f拆分名称并重新排列各部分。

编辑:由于Compo的提示,更改了使用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"

答案 1 :(得分:0)

这是一个使用延迟扩展的想法:

var names = new List<String> { "alex", "liza", "harry" };

var d = names.ToDictionary(n => Guid.NewGuid());

答案 2 :(得分:0)

如果有点笨拙,您的方法很好。

但是我认为您需要延迟扩展,并使用!代替%

setlocal enabledelayedexpansion
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
)