2016-07-31 87 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! 
)