寫Windows的批處理程序,一般只是想實現一些簡單的功能。例如將文件夾下的文件批量改後綴名,一句rename "*.lua" "*.txt"
就能實現,不需要編譯,一個記事本一句話就可以搞定。
但是這並不代表批處理只能用於實現這種近乎一次性的功能。
本人在某製造業的工作期間,生產線電腦的維護一直是一個很棘手的事情。因爲生產線是24小時工作,控制產線的PC也是24小時運轉,軟件運行難免有垃圾。
但是軟件廠商一般都不會處理這方面的問題。
當時碰到的難題是:
有 2年 * 365天 * 24小時 * 100個記錄 * 10 共計17520000個文件需要你刪除,你會怎麼做?
(文件夾層次就是按照 日期\小時\產品編號\產品記錄 存放,軟件有刪除文件的功能,但是居然不刪文件夾,文件夾多了軟件特別容易在存圖時卡死,而且奇葩的是居然好幾十臺電腦兩年沒有人去刪它!!!)
直接右鍵刪除父級目錄?圖樣圖森破圖內衛!Windows是需要把文件句柄全都處理之後再進行確認刪除的(表達可能有誤,但是意思肯定沒錯),等它將這千萬個文件處理完然後你再來點擊確定?我估計你第二天也等不到,況且這段時間電腦的卡頓讓你沒法保證生產線的正常運行。再說當月的文件規定是不能刪除的。
一天或者一個月的刪除?可以!每天專人負責,可以刪掉四個月左右。產線裏電腦大概有50多臺需要做這樣的工作。。。
用Batch批處理就簡單多了,rd /s /q
,運行起來都不用你管。要保證運行不卡?文件夾遍歷到小時,一小時一小時刪總沒問題了吧。
@echo off
setlocal enabledelayedexpansion
for /l %%i in (1,1,12) do (
set /a m=%%i+100
set m=!m:~-2!
for /l %%j in (1,1,31) do (
set /a d=%%j+100
set d=!d:~-2!
for /l %%k in (0,1,23) do (
set /a h=%%k+100
set h=!h:~-2!
rem 設置要刪除的路徑的父級路徑
set p="D:\AllImage\Table1"
rd /s /q !p!\!m!-!d!\!h!
)
rd /s /q !p!\!m!-!d!
)
)
pause
這樣,程序就能夠自動遍歷文件夾到小時級,然後靜默刪除。
繼續但是!上面是直接遍歷12個月份31天24個小時,而且路徑也是固定的。不要指望教別人一兩句別人就知道這個文件可以怎麼改,更不要指望誰都能看懂上面的代碼。
處女座的程序猿怎麼能夠滿足於這種半成品?!自己整理了一下這個程序的需求
- 需要能夠設定刪除的時間段,最好能自動判斷需要刪除的時間段
- 需要能夠設定刪除的文件夾,最好能設定多個路徑
- 最好能夠設置密碼,防止不相關人員的誤操作
於是我的AutoDelete程序出現了
- Path.cfg 用來存放需要刪除的文件夾路徑
path1=D:\AllImage\Table1
path2=D:\AllImage\Table2
path3=D:\FailImage\Table1
path4=D:\FailImage\Table2
path5=D:\Images\Table1
path6=D:\Images\Table2
- AutoDelete.bat 從這個文件運行會保留最近兩個月的文件,其他的刪除(不同年同月份的文件會在一起,所以沒進行處理)
@echo off
setlocal enabledelayedexpansion
rem Parameter
set ms=1
set me=10
set ds=1
set de=31
set hs=0
set he=23
set /a ms=1%date:~5,2%+!ms!-100
set /a me=1%date:~5,2%+!me!-100
Call .\CFG\Login.bat
- DeleteByMonth.bat 從這個文件運行會要求你輸入需要刪除的月份
@echo off
setlocal enabledelayedexpansion
rem Parameter
set /p ms=Please set the month you want to delete:
set me=!ms!
set ds=1
set de=31
set hs=0
set he=23
Call .\CFG\Login.bat
- Login.bat 一個簡單的密碼驗證,怕別人誤操作
set /p password="please input your password:"
if %password%==0000 goto pwcorrect else goto pwwrong
:pwwrong
echo "password is wrong!!"
echo "press anykey to exit..."
pause>nul
exit
:pwcorrect
echo "access available"
echo "AutoDelete will be running, you can exit this program in anytime..."
ping 127.0.0.1 -n 03>nul
echo -------------------------------------------
echo "press anykey to confirm your operation..."
pause>nul
Call .\CFG\Delete.bat
- Delete.bat 根據上面的設置進行遍歷刪除
set /a ms=!ms!-1
set /a me=!me!-1
for /l %%i in (!ms!,1,!me!) do (
set /a m=%%i %% 12+101
set m=!m:~-2!
for /l %%j in (!ds!,1,!de!) do (
set /a d=%%j+100
set d=!d:~-2!
for /f "tokens=2* delims==" %%t in (.\CFG\Path.cfg) do (
set p=%%t
echo "----------!p!\!m!-!d! Delete Start----------"
for /l %%k in (!hs!,1,!he!) do (
set /a h=%%k+100
set h=!h:~-2!
echo ----
echo "!p!\!m!-!d!\!h! Delete Start"
rd /s /q !p!\!m!-!d!\!h!
echo "!p!\!m!-!d!\!h! Delete Complete"
echo ----
)
rd /s /q !p!\!m!-!d!
echo "----------!p!\!m!-!d! Delete Complete----------"
)
)
)
pause
功能實際上依然很簡單,也就是處理一下路徑,然後刪除文件夾。加了一些亂七八糟的輸出語句,加了一些可調的參數,整個程序就顯得高大上了(當然,這只是對於不懂的人)。現在要刪除這些文件,雙擊輸入密碼確認後,什麼都不用管,完活後去確認一下就行。
當然,可能會有人覺得,這種東西用個高級語言寫起來多爽,路徑處理都不用自己寫,什麼語言還沒有個File庫?
但是當你電腦上沒有編譯器,要方便隨時改代碼,產線電腦又不讓隨便運行程序時,記事本和批處理真的是一大福星,隨時隨地改,走哪用到哪。
在做出了這個能應用在好幾十臺電腦上的bat程序之後,文件自動備份,網絡代理切換,磁盤檢查並保存日誌,電腦開WiFi。。。好多事情都慢慢在學習批處理的過程中從複雜的操作變成了傻瓜式的雙擊運行,文件或者代碼直接發給別人也可以用。這些程序我都會繼續修改加強程序的通用性,用法和代碼也會在之後的文章中進行整理。