我有数百个文件要重命名以匹配新的约定。 当前约定为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%提取子字符串。
答案 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
)