.bat脚本初体验——使用批处理bat清洗文件名
.bat腳本初體驗——使用批處理bat清洗文件名
雖然說bat批處理腳本就是連續執行一條條DOS命令,相對于C語言等編程語言來說顯得十分有限,但對多個文件進行批量操作是非常方便的。這篇文章旨在記錄一下我無意中想到的使用bat的一個小實例。
對批處理和DOS命令熟悉的大神可以直接跳過。
使用場景
本人喜歡看電影,習慣了將電影在各大資源網站上面下載下來有空看看。下載下來的視頻文件就會遇到下面這樣的情況:
強迫癥患者簡直不能忍。。
但是文件夾里面有幾百個視頻文件,逐個逐個改對于程序員來說是不可接受的。
之前也嘗試過使用python碼一個腳本遍歷文件然后去掉相關的廣告字眼,但是毫無疑問這種情況批處理腳本更適合。
bat解決批量文件名清洗
直接上代碼:
@echo offREM MainProgrem setlocal enabledelayedexpansion set sum=0 for /r %%i in (.,*)do ( echo %%i set old_string=%1 set new_string= echo %%i|findstr "!old_string!" >nul if !errorlevel! equ 0 (echo 找到目標!call :getNewName %%i !old_string! !new_string!set /a sum+=1 ) ) echo 一共修改了!sum!個文件。 pause:getNewName set whole_string=%1 set old_char=%2 set new_char=%3 setlocal enabledelayedexpansion for /f "tokens=*" %%i in ("%whole_string%") do ( set "var=%%i"if not !var!.==. (set "var=!var:%old_char%=%new_char%!"echo !var!>>newname.txt) ) set /p newname=<newname.txt call :changeFileName %1 %newname% del newname.txt goto :eof:changeFileName echo 將文件名:%1 改成:%2 move %1 %2 goto :eof主要的思路就是:遍歷當前目錄的文件——尋找廣告字符串——得出新的文件名——修改文件名。
當然這里面包含著很多bat的一些基本語法的使用,沒有bat使用經驗的人會處處碰壁,各種語法出錯或者是達不到預期效果。下面是主要使用到的批處理知識要點:
echo與REM
echo指的是回顯輸出。我們最常用的就是echo 【提示信息】,在屏幕上輸出提示信息。
我們可以使用echo on/echo off對當前的回顯功能進行設置;
直接輸入echo可以查看當前的echo設置狀態;REM是注釋命令,該命令后的內容將不會被程序執行,但是能回顯。
平時也會使用::雙冒號來更簡潔地進行注釋,與REM的區別在于::后面的字符在執行時不會回顯,如論你是否執行echo on
但是這里要注意的是冒號需要慎用,冒號后面緊跟一個以字母數字開頭的字符串,我們稱之為有效標號,是可以被call和goto語句識別的;而冒號后面緊跟一個非字母數字的特殊符號就成為無效標號,可以起到注釋作用。重定向符
重定向符號是bat腳本中使用非常頻繁的特殊符號之一。有>、>>、<、>&、<&等。
DOS的標準輸入輸出通常是在鍵盤和顯示器上進行的,但是利用重定向可以方便地對磁盤文件和其他設備進行輸入輸出操作。
輸出重定向符>將命令發送到設備和文件當中,如echo hello word>test.txt,此處test.txt是新建一個文件并且寫入心的內容,如果目錄下已經有test.txt則覆蓋掉之前的內容;而如果使用>>重定向的話,則不會覆蓋以前的內容,而是將內容追加到原有文件的末尾處。
需要注意的是,重定向符前面不需要加空格,不然該空格則被當成是輸出的內容添加到文件或設備當中。set語句
set語句最大的作用就是對變量進行賦值。
在批處理中,允許兩類的變量存在——系統變量和自定義變量。
系統變量有很多,是系統事先定義并且自動賦值的變量。如%DATE%、%HOMEPATH%等等。若想要知道系統變量的值我們可以在命令行中直接echo出來即可。另外,我們在使用批處理的參數0%~9%也屬于系統變量。
自定義變量即我們在編寫bat腳本的過程中我們可以自由賦值的變量。
set命令最常用的格式是SET [variable=[string]] ,就是很單純地將一個值賦給一個值;set命令還有兩種比較常用的參數形式/p和/a,它們的用法是SET /P variable=[promptString] 和SET /A variable=[expression] 。
find和findstr
命令find可以在文件中搜索字符串,用法
FIND [/V] [/C] [/N] [/I] [/OFF[LINE]] "string" [[drive:][path]filename[ ...]]
/V 顯示所有未包含指定字符串的行。
/C 僅顯示包含字符串的行數。
/N 顯示行號。
/I 搜索字符串時忽略大小寫。
/OFF[LINE] 不要跳過具有脫機屬性集的文件。
“string” 指定要搜索的文字串,
[drive:][path]filename 指定要搜索的文件。
如果沒有指定路徑,FIND 將搜索鍵入的或者由另一命令產生的文字。
Find常和type命令和管道符|結合使用:
Type [drive:][path]filename | find "string" [>tmpfile] #挑選包含string的行
Type [drive:][path]filename | find /v "string" #剔除文件中包含string的行
Type [drive:][path]filename | find /c #顯示文件行數
以上用法將去除find命令自帶的提示語(文件名提示)
命令findstr同樣也是搜索字符串,使用方法和參數設置更為復雜,詳細的可以參看:
https://blog.csdn.net/zhouzihan520xj/article/details/40301041for循環
for循環的基本格式:
FOR %%variable IN (set) DO command [command-parameters]
%variable 指定一個單一字母表示可替換的參數。
(set) 指定一個或一組文件。可以使用通配符。
command 指定對每個文件執行的命令。
command-parameters 為特定命令指定參數或命令行開關。
for循環有4個參數:/d、/l、/r、/f。
參數/d主要用于遍歷目錄,不會遍歷文件:
FOR /D %%variable IN (set) DO command [command-parameters]
參數/r可以遍歷目錄以及文件:
FOR /R [[drive:]path] %%variable IN (set) DO command [command-parameters]
參數/l可以遍歷以增量形式從開始到結束的一個數字序列集:
FOR /L %%variable IN (start,step,end) DO command [command-parameters]
參數/f就比較復雜,使用文件解析來處理命令輸出、字符串及文件內容。使用迭代變量定義要檢查的內容或字符串,并使用各種options選項進一步修改解析方式。使用options令牌選項指定哪些令牌應該作為迭代變量傳遞。請注意:在沒有使用令牌選項時,/F 將只檢查第一個令牌。文件解析過程包括讀取輸出、字符串或文件內容,將其分成獨立的文本行以及再將每行解析成零個或更多個令牌。然后通過設置為令牌的迭代變量值,調用 for 循環。默認情況下,/F傳遞每個文件每一行的第一個空白分隔符號。跳過空行。
FOR /F ["options"] %%variable IN (file-set) DO command [command-parameters]
FOR /F ["options"] %%variable IN ("string") DO command [command-parameters]
FOR /F ["options"] %%variable IN ('command') DO command [command-parameters]
帶引號的字符串”options”包括一個或多個指定不同解析選項的關鍵字。這些關鍵字為:
eol=c - 指一個行注釋字符的結尾(就一個)(備注:默認以使用;號為行首字符的為注釋行)
skip=n - 指在文件開始時忽略的行數,(備注:最小為1,n可以大于文件的總行數,默認為1。)
delims=xxx - 指分隔符集。這個替換了空格和跳格鍵的默認分隔符集。
tokens=x,y,m-n - 指每行的哪一個符號被傳遞到每個迭代的 for 本身。這會導致額外變量名稱的分配。m-n格式為一個范圍。通過 nth 符號指定 mth。如果符號字符串中的最后一個字符星號,那么額外的變量將在最后一個符號解析之后分配并接受行的保留文本。經測試,該參數最多只能區分31個字段。(備注:默認為1,則表示只顯示分割后的第一列的內容,最大是31,超過最大則無法表示)
usebackq - 使用后引號(鍵盤上數字1左面的那個鍵)。
未使用參數usebackq時:file-set表示文件,但不能含有空格;雙引號表示字符串,即”string”;單引號表示執行命令,即’command’; 使用參數usebackq時:file-set和”file-set”都表示文件, 當文件路徑或名稱中有空格時,就可以用雙引號括起來,單引號表示字符串,即’string’,后引號表示命令執行,即command。
- setlocal與變量延遲
當我們使用到for循環并且在里面需要對變量進行動態賦值的時候,我們肯定要面臨的問題就是變量延遲。這是由于批處理是按行讀取命令這一機制導致的。在批處理對一行的命令進行執行之前,將會有一個預處理的過程,其中就包括了對命令中的變量進行賦值。
我們可以使用setlocal enabledelayedexpansion來開啟變量延遲,并且后續對需要延遲賦值的變量使用一對感嘆號!!括起來。
在程序中,對總數sum、傳入子程序的old_string和new_string以及getNewName中的var我們都需要設置變量延遲,否則將會由于賦值過程中出現問題,達不到預期的效果。
使用實例如下:
if條件語句與errorlevel
if是條件判斷語句,語法格式:
IF [NOT] ERRORLEVEL number command
IF [NOT] string1 compare-op string2 command
IF [NOT] EXIST filename command
第一行用法中的errorlevel表示程序上一行命令的返回碼,用于判斷上一行命令是否執行成功。上面程序中的echo %%i|findstr "!old_string!" >nul意思就是在參數%%i中尋找是否存在字符串old_string,并且屏蔽了命令執行成功的信息。一般執行成功errorlever默認值為0,出錯一般為1或者9009等其他正值。
其中第二行用法中的compare-op包括:
EQU - 等于
NEQ - 不等于
LSS - 小于
LEQ - 小于或等于
GTR - 大于
GEQ - 大于或等于
另外,加上參數[/I]則不考慮大小寫。call調用子程序
Call命令可以在批處理中調用另一個批處理程序,并且在執行完該程序之后繼續執行原來的批處理。
CALL command直接執行一條命令。
CALL [drive:][path]filename [batch-parameters]調用其他批處理程序,必須是.bat或者.cmd程序。
CALL :label arguments調用本文件內的命令段,相當于子程序。被調用的子程序以:label開頭,以goto :eof結尾。- 文件名修改命令
bat中使用ren和move這兩個命令對文件名進行修改。
他們的區別在于使用ren命令修改文件名字時文件位置會保持在同一個文件夾目錄下;move命令可以跨文件夾目錄進行文件名修改:
ren d:/test/oldname.txt newname.txt
move d:/test/ouldname.txt e:/test/newname.txt
可以看到ren的第二個參數不需要指定[drive:][path],即驅動和目錄路徑,而move的兩個參數都要求使用完整的文件目錄路徑。當然move也可以在同一個文件夾目錄下對文件名進行修改,只要參數設置對就行了。
運行過程和結果
運行腳本:E:\迅雷下載>start namecleaner.bat 電影天堂www.dy2018.com
運行結果:
終于沒有廣告了,舒服了。
參考
https://www.cnblogs.com/iTlijun/p/6137027.html
https://www.jb51.net/article/110243.htm
http://blog.sina.com.cn/s/blog_70371d7d0101dwb4.html
https://blog.csdn.net/albertsh/article/details/52788106
https://blog.csdn.net/i_likechard/article/details/65631403
https://www.jb51.net/article/18973.htm
總結
以上是生活随笔為你收集整理的.bat脚本初体验——使用批处理bat清洗文件名的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: sis最新ip地址2020入口一_【新版
- 下一篇: html蔚蓝网注册页面,如何在网站中添加