2016-07-31 130 views
0

我有几百个文件以特定的方式命名,需要根据第六个字符替换第13-15个字符来重命名。我一直无法创造出能够读取第6个字符的东西,而是让它独立,只更改第13-15个字符。Windows批处理文件做到有条件重命名

这些文件的格式如下。

2016-A124578_XYZ_moretext.ext 
2016-B345654_XYZ_morerandomtext.ext 
2016-B235689_XYZ_moredifferenttext.ext 
2016-A789945_XYZ_moretext.ext 
2016-C547821_XYZ_moretext.ext 

脚本需要读取第6个字符(A,B或C),并用AAABBBCCC更换XYZ取决于信。文件名的其余部分需要显示相同。

2016-A124578_XYZ_moretext.ext becomes 2016-A124578_AAA_moretext.ext 
2016-B345654_XYZ_morerandomtext.ext becomes 2016-B345654_BBB_morerandomtext.ext 

是否可以制作这种脚本? RegEx是否是尝试它的最佳方式?

+0

如果你已经不知道如何编写批处理文件,请你帮个忙,学习的PowerShell代替。做任何事情,即使有点复杂的批次是痛苦的*。越早忘记它存在,越好。 Powershell更好,并且它已经预装在现代Windows系统上。它实际上也支持正则表达式 - 批处理不支持。 – Blorgbeard

+0

PowerShell不必要的冗长,默认情况下甚至不启用。除非你有一个打字恋物癖,坚持批量。 – SomethingDark

+0

这不是最好的语言,但是如果你想要写实际的程序而不安装新的东西,那就是Powershell或批处理。批处理是一堆非常可怕的向后兼容的黑客攻击,语法反映了这一点。 Powershell有时是冗长的,但有很多IDE用于自动完成。对于简单的命令列表,批处理是很好的。任何更复杂的事情,这只是可怕的。我的想法是。 – Blorgbeard

回答

1
Set Str=2016-B345654_XYZ_morerandomtext.ext 
Echo %str% %str:~0,13% %str:~5,1%%str:~5,1%%str:~5,1% %str:~16% 

我已经在其中放入空格来显示哪部分做了什么,删除它们。

请参阅set /?寻求帮助。

1

我发现一个更简单的方法来实现这一点,知道文件的格式将永远是我上面指定的。

只需在一个批处理文件中使用此...

REN 2016-A*.ext 2016-A??????_AAA_*.ext 
REN 2016-B*.ext 2016-B??????_BBB_*.ext 
REN 2016-C*.ext 2016-C??????_CCC_*.ext 
+0

+1,但我可以进一步简化。此外,还有一些方法可以减少相当简单的假设。请参阅[我的答案](http://stackoverflow.com/a/38690293/1012053)。 – dbenham

0

更简单:-)

for %A in (A B C) @do ren 2016-%A*.ext *_%A%A%A* 

如果从一个批处理文件运行,然后双击该百分比:

@for %%A in (A B C) @do ren 2016-%%A*.ext *_%%A%%A%%A* 

有关此RENAME工作原因的信息,请参阅How does the Windows RENAME command interpret wildcards?

但是,代码假定文件夹内的所有文件都遵循该模式。如果存在与不应重命名的模式不匹配的文件,该怎么办?简单的过滤器存在重命名不应重命名的文件的风险。

你可能会有点用源掩码更精确:

for %A in (A B C) @do ren 2016-%A??????_XYZ_*.ext *_%A%A%A* 

但还有两个潜在的问题:

  • ?匹配0或1个字符,所以它保证不会有超过6个字符,但可能少于6个
  • ?匹配任何字符,而不仅仅是数字。

你可以使用加上FINDSTR DIR/B是非常具体:

for %A in (A B C) @do for %F in (dir /b /a-d 2016-%A*.ext^|findstr /ric:"2016-%A[0-9][0-9][0-9][0-9][0-9][0-9]_XYZ_*\.ext"') do ren "%F" *_%A%A%A* 

但还有另一种解决方案,既简单又准确 - a regular expression rename utility called JREN.BAT。它是纯脚本(混合批处理/ JScript),可以在任何Windows机器上本地运行,而不需要任何第三方exe文件。

jren "^(2016-([ABC])\d{6}_)XYZ(_.*\.ext)$" "$1$2$2$2$3" /i 
0

这一个有点冗长,但我觉得更容易阅读和修改:

@Echo off 
setlocal enabledelayedexpansion 
for /f %%f in ('dir *.ext /b') do (
    set fName=%%f 
    set fTag=!fName:~5,1! 
    set fPrefix=!fName:~0,13! 
    set fSuffix=!fName:~16! 
    set fReplace=!fName:~13,3! 
    if /i "!fTag!" EQU "A" set fReplace=AAA 
    if /i "!fTag!" EQU "B" set fReplace=BBB 
    if /i "!fTag!" EQU "C" set fReplace=CCC 

    ren !fName! !fPrefix!!fReplace!!fSuffix! 
)