經驗: Windows Batch 的寫作 (114-01-15)

来自Tsetien’s Wiki
跳转到导航 跳转到搜索

可以透過以下 Windows Batch 指令碼簡單地將不超過 1,000 個的某類型的檔案(此處以 .png 為例)按照其在硬碟上的創建時間由先往後排序,重新命名為自 000 起的簡短編號。

ddd-numbering.bat
@echo off
chcp 65001
setlocal enabledelayedexpansion
set /a a=-1
for /f "tokens=*" %%a in ('dir *.png /b /od /tc') do set /a a=a+1 & if !a! lss 10 (set "b=00!a!" & ren %%a !b!.png) else if !a! lss 100 (set "b=0!a!" & ren %%a !b!.png) else (ren %%a !a!.png)
endlocal

此處主要用到了 dir 命令的自訂排序功能,如果需要按照創建時間的倒序(也即最後創建的在先、最先創建的在後)排序,則將 /od 換為 /o-d 即可;去除 /tc 則為預設的按照修改時間而非創建時間排序。

這段小巧的指令碼用來臨時重新命名一些編輯後便刪除的臨時檔案非常好用,比如透過 Win + Print Scrn 取得的熒幕截取,那種會很快編輯然後刪除原檔的東西,將其主名稱縮短至 3 個字元也有利於在諸如 Photoshop 等軟體中編輯時切換檔案標籤。

但是這種「一列式」指令碼在更復雜的情況下就比較難以寫就了,因此還是乖乖拆開來寫較好,就比如將所有開頭為西元 4 位數年份的檔案都重新命名為使用 3 位數國曆年份的,則可透過如下所述之指令碼來完成——

ce2ar.bat
@echo off
chcp 65001
setlocal enabledelayedexpansion
set /a t=0
for %%a in (*.jpg) do set /a n+=1
:a
if %t% == %n% goto e
for %%a in (*.jpg) do set "f=%%a" & goto p
:p
set /a "c=%f:~0,4%"
set "r=%f:~4%"
set /a a=c-1911
if !a! lss 100 (
	set "b=0!a!"
	ren "!f!" "!b!!r!"
) else (
	ren "!f!" "!a!!r!"
)
if not exist temp md temp
move "!b!!r!" temp
move "!a!!r!" temp
set /a t+=1
goto a
:e
move temp\*.* .
rd /s/q temp
endlocal

其中的 ‘temp’ 資料夾只是一個演示用的臨時資料夾名稱,在實際使用時可以改為更為怪異的字串以便保証沒有已經存在的同名資料夾。

同樣,此處只會對 .jpg 檔案作此處理,但是如果需要處理的是更廣泛的檔案類型,則可隨意根據需要增添其他類型的副檔名到兩處 for %%a in (*.jpg) do 的括號中,亦或是直接使用 *.* 如果有足夠自信不會造成過多處理的話。

如果一定要可以在雜亂的檔案叢中使用且不使其報錯或者過度處理的話,則可在設完 %c% 後加入對 %c% 是否是數字、是否大於 1911 的檢測,並在得到否的結果時直接來個 goto 並指向檔案移動部分(可以新標記為 :m——此時的移動模塊自然也要新加寫一列,將 %f% 也移動到 temp, 然後讓處理計數 %t% 去加一。