(建議用電腦浏覽本文效果更好)
自己編寫的一個DOS批處理,用于批量修改文件名或擴展名。
實現邏輯:
操作:批處理運行後會在當前文件夾下生成一個錯誤信息文件batResult.txt
字符替換:
示例一:将文件名中的“5”替換成“99”
原文件
運行批處理文件batRename2.bat:
結果:
示例二:将“廢柴兄弟”改成“上海灘”,并将擴展名改為“bat”
操作:
結果:
改成新文件名:将所有擴展名為bat文件改成新文件名newBAT,後綴改為ttt
操作:
結果:
程序實現方法一:
@echo off
rem 切換為utf-8編碼
::Chcp 65001
::切換中文
Chcp 936 > nul
rem 啟用延緩環境變量擴展
setlocal EnableDelayedExpansion
echo **可修改當前文件夾下所有的文件名或字符及擴展名**
echo *****将此批處理文件拷入需要修改的文件夾中******
set option=9
set cnt=0
set skipChar=/\*?:"<>|^!
echo ** 請選擇操作... **
echo ** 1 替換部分字符或擴展名 **
echo ** 0 換成全新文件名 **
:selectOption
set /p option= 》》請選擇操作選項:
if %option%==1 ( goto endSelectOption
) else if %option%==0 (goto endSelectOption)
set /a cnt =1
if %cnt% GTR 2 (goto end) else (goto selectOption)
:endSelectOption
echo ------要修改的原文件信息,回車結束輸入-------
set retVal=0
:inputOfi
set oldFile=
set retVal=0
if %option%==1 ( set /p oldFile="》》請輸入要替換的文件名/文字(必輸入):"
) else (set /p oldFile="》》請輸入要修改的文件名/文字(不輸入則包括當前文件夾下所有文件): ")
if %option%==1 (if "%oldFile%"=="" echo 被替換字符不能為空!& goto inputOfi
) else (if "%oldFile%"=="*" goto inputOfe
if "%oldFile%"=="" ( set oldFile=*
goto inputOfe))
@echo !oldFile! | findstr "[!skipChar!]" > nul
if "!errorlevel!"=="0" (echo !!輸入的文件名/字符"!oldFile!"錯誤!!
rem 如果用%skipChar%則出現“此時不應有 >”的錯誤提示。
echo !!字符中不能包含"!skipChar!"中的字符 !!
goto inputOfi)
:inputOfe
set oldFExt=
set retVal=0
set /p oldFExt= 》》請輸入原文件擴展名(不輸入則包括所有擴展名):
if "%oldFExt%"=="*" goto endInputOfe
if "%oldFExt%"=="" (set oldFExt=*
) else (@echo !oldFExt!| findstr "[^0-9A-Za-z]" > nul
if "!errorlevel!"=="0" (
echo !!擴展名"%oldFExt%"錯誤!!
echo !!請輸入0-9,A-Z,a-z之間的字符!!
goto inputOfe))
:endInputOfe
echo === 查找範圍:"*!oldFile!*.!oldFExt!" ===
echo -----新的文件信息,回車結束輸入------
:inputNfi
set newFile=
set retVal=0
set /p newFile="》》請輸入新的文件名/字符(必輸入):"
if not "%newFile%"=="" (
@echo !newFile! | findstr "[!skipChar!]" > nul
if "!errorlevel!"=="0" (
echo !!輸入的文件名/字符"%newFile%"錯誤!!
echo !!字符中不能包含"!skipChar!"中的字符 !!
goto inputNfi)
) else (echo 新的文件名/字符不能為空!& goto inputNfi)
:inputNfe
set newFExt=
set retVal=0
if %option%==1 (if "!oldFExt!"=="*" (goto endInputNfe ))
set /p newFExt="》》輸入新的文件擴展名(不輸入則保留原擴展名):")
if "!newFExt!" neq "" (
@echo !newFExt!| findstr "[^0-9A-Za-z]" > nul
if "!errorlevel!"=="0" (
echo !! 擴展名"%newFExt%"錯誤 !!
echo !!請輸入0-9,A-Z,a-z之間的字符!!
goto inputNfe)
)
:endInputNfe
echo === 查找範圍: "*!oldFile!*.!oldFExt!" ===
if %option%==1 (if "%newFExt%" neq "" (echo === 替換為: "*!newFile!*.!newFExt!" ===
) else (echo === 替換為: "*!newFile!*.原擴展名" === )
) else (if "%newFExt%"=="" (echo === 新的内容為:"!newFile!000N.原擴展名" ===
) else (echo === 新的内容為:"!newFile!000N.!newFExt!" ===))
rem --------------------處--理-------------------------
set ttl=0
set a=1
set aStr=0001
set /p confirm=請确認是否修改?(輸入:Y-是,N-否)
if "%confirm%" neq "Y" (if "%confirm%" neq "y" goto end)
rem set oft="%oft%.%oldFExt%"
for /f "delims=" %%i in ( 'dir /b /a-d "*%oldFile%*.%oldFExt%" ' ) do (
if "%oldFile%"=="*" (@echo %%~ni | findstr /i ".%oldFile%" > nul
) else (@echo %%~ni | findstr /iL /c:"%oldFile%" > nul)
if "!errorlevel!"=="0" (
rem 不需修改當前批處理文件名(本身)
if not "%%~ni"=="%~n0" (
set /a ttl =1
::隻有文件名,如test.txt時,隻有test
set file=%%~ni
::隻有擴展名,如test.txt時,隻有.txt
set ext=%%~xi
if !option!==1 (set file=!file:%oldFile%=%newFile%!
if "%newFExt%"=="" (
ren "%%i" "!file!!ext!" 1>> batResult.txt 2<&1
if "!errorlevel!" neq "0" ( echo --原文件"%%i",新文件名"!file!!ext!"-- >>batResult.txt
) else (set /a a =1)
) else (ren "%%i" "!file!.%newFExt%" 2>> batResult.txt
if "!errorlevel!" neq "0" ( echo --原文件"%%i",新文件名"!file!.%newFExt%"-- >>batResult.txt
) else (set /a a =1))
) else (set file=%newFile%!aStr!
if "%newFExt%"=="" (
ren "%%i" "!file!!ext!" 1>> batResult.txt 2<&1
if "!errorlevel!" neq "0" ( echo --原文件"%%i",新文件名"!file!!ext!"-- >>batResult.txt
) else (set /a a =1
if !a! LSS 10 (set aStr=000!a!
) else if !a! LSS 100 (set aStr=00!a!
) else if !a! LSS 1000 (set aStr=0!a!))
) else (ren "%%i" "!file!.%newFExt%" 2>> batResult.txt
if "!errorlevel!" neq "0" ( echo --原文件"%%i",新文件名"!file!.%newFExt%"-- >>batResult.txt
) else (set /a a =1
if !a! LSS 10 (set aStr=000!a!
) else if !a! LSS 100 (set aStr=00!a!
) else if !a! LSS 1000 (set aStr=0!a!))
)
)
rem echo a=!a!,oldFile-^> newFile:"%%i" -^> "!file!.%newFExt%"
)
)
)
:end
set /a a-=1
echo 總處理文件數:!ttl! ,處理成功數:!a!
endlocal
pause
goto :eof
程序實現方法二:與方法一區别在于判斷字符的合法性方面
@echo off
rem 切換為utf-8編碼
::Chcp 65001
::切換中文
Chcp 936 > nul
rem 啟用延緩環境變量擴展
setlocal EnableDelayedExpansion
echo **可修改當前文件夾下所有的文件名或字符及擴展名**
echo *****将此批處理文件拷入需要修改的文件夾中******
set option=9
set cnt=0
set skipChar=/\*?:"<>|^!
echo ** 請選擇操作... **
echo ** 1 替換部分字符或擴展名 **
echo ** 0 換成全新文件名 **
:selectOption
set /p option= 》》請選擇操作選項:
if %option%==1 ( goto endSelectOption
) else if %option%==0 (goto endSelectOption)
set /a cnt =1
if %cnt% GTR 2 (goto end) else (goto selectOption)
:endSelectOption
echo ------要修改的原文件信息,回車結束輸入-------
set retVal=0
:inputOfi
set oldFile=
set retVal=0
if %option%==1 ( set /p oldFile="》》請輸入要替換的文件名/文字(必輸入):"
) else (set /p oldFile="》》請輸入要修改的文件名/文字(不輸入則包括當前文件夾下所有文件): ")
if %option%==1 (if "%oldFile%"=="" echo 被替換字符不能為空!& goto inputOfi
) else (if "%oldFile%"=="*" goto inputOfe
if "%oldFile%"=="" ( set oldFile=*
goto inputOfe))
rem echo oldFile="!oldFile!",!oldFile!,"%oldFile%",%oldFile%
rem call :checkFileChar "%oldFile%" %skipChar% oldFile中如有!用%會出錯.
call :checkFileChar "!oldFile!" %skipChar%
if !retVal!==1 (echo !!輸入的文件名/字符"%oldFile%"錯誤!!
rem 如果用%skipChar%則出現“此時不應有 >”的錯誤提示。
echo !!字符中不能包含"!skipChar!"中的字符 !!
goto inputOfi)
:inputOfe
set oldFExt=
set retVal=0
set /p oldFExt= 》》請輸入原文件擴展名(不輸入則包括所有擴展名):
if "%oldFExt%"=="*" goto endInputOfe
if "%oldFExt%"=="" (set oldFExt=*
) else (call :checkExtChar "!oldFExt!" "O"
if !retVal!==1 (echo !!擴展名"%oldFExt%"錯誤!!
echo !!請輸入0-9,A-Z,a-z之間的字符!!
goto inputOfe))
:endInputOfe
echo === 查找範圍:"*!oldFile!*.!oldFExt!" ===
echo -----新的文件信息,回車結束輸入------
:inputNfi
set newFile=
set retVal=0
set /p newFile="》》請輸入新的文件名/字符(必輸入):"
if not "%newFile%"=="" (call:checkFileChar "!newFile!" %skipChar%
if !retVal!==1 (echo !!輸入的文件名/字符"%newFile%"錯誤!!
echo !!字符中不能包含"!skipChar!"中的字符 !!
goto inputNfi)
) else (echo 新的文件名/字符不能為空!& goto inputNfi)
:inputNfe
set newFExt=
set retVal=0
if %option%==1 (if "!oldFExt!"=="*" (goto endInputNfe ))
set /p newFExt="》》輸入新的文件擴展名(不輸入則保留原擴展名):")
if "!newFExt!" neq "" (call:checkExtChar "!newFExt!" "N"
if !retVal!==1 (echo !! 擴展名"%newFExt%"錯誤 !!
echo !!請輸入0-9,A-Z,a-z之間的字符!!
goto inputNfe)
)
:endInputNfe
echo === 查找範圍: "*!oldFile!*.!oldFExt!" ===
if %option%==1 (if "%newFExt%" neq "" (echo === 替換為: "*!newFile!*.!newFExt!" ===
) else (echo === 替換為: "*!newFile!*.原擴展名" === )
) else (if "%newFExt%"=="" (echo === 新的内容為:"!newFile!000N.原擴展名" ===
) else (echo === 新的内容為:"!newFile!000N.!newFExt!" ===))
rem --------------------處--理-------------------------
set ttl=0
set a=1
set aStr=0001
set /p confirm=請确認是否修改?(輸入:Y-是,N-否)
if "%confirm%" neq "Y" (if "%confirm%" neq "y" goto end)
rem set oft="%oft%.%oldFExt%"
for /f "delims=" %%i in ( 'dir /b /a-d "*%oldFile%*.%oldFExt%" ' ) do (
if "%oldFile%"=="*" (@echo %%~ni | findstr /i ".%oldFile%" > nul
) else (@echo %%~ni | findstr /iL /c:"%oldFile%" > nul)
if "!errorlevel!"=="0" (
rem 不需修改當前批處理文件名(本身)
if not "%%~ni"=="%~n0" (
set /a ttl =1
::隻有文件名,如test.txt時,隻有test
set file=%%~ni
::隻有擴展名,如test.txt時,隻有.txt
set ext=%%~xi
if !option!==1 (set file=!file:%oldFile%=%newFile%!
if "%newFExt%"=="" (
ren "%%i" "!file!!ext!" 1>> batResult.txt 2<&1
if "!errorlevel!" neq "0" ( echo --原文件"%%i",新文件名"!file!!ext!"-- >>batResult.txt
) else (set /a a =1)
) else (ren "%%i" "!file!.%newFExt%" 2>> batResult.txt
if "!errorlevel!" neq "0" ( echo --原文件"%%i",新文件名"!file!.%newFExt%"-- >>batResult.txt
) else (set /a a =1))
) else (set file=%newFile%!aStr!
if "%newFExt%"=="" (
ren "%%i" "!file!!ext!" 1>> batResult.txt 2<&1
if "!errorlevel!" neq "0" ( echo --原文件"%%i",新文件名"!file!!ext!"-- >>batResult.txt
) else (set /a a =1
if !a! LSS 10 (set aStr=000!a!
) else if !a! LSS 100 (set aStr=00!a!
) else if !a! LSS 1000 (set aStr=0!a!))
) else (ren "%%i" "!file!.%newFExt%" 2>> batResult.txt
if "!errorlevel!" neq "0" ( echo --原文件"%%i",新文件名"!file!.%newFExt%"-- >>batResult.txt
) else (set /a a =1
if !a! LSS 10 (set aStr=000!a!
) else if !a! LSS 100 (set aStr=00!a!
) else if !a! LSS 1000 (set aStr=0!a!))
)
)
rem echo a=!a!,oldFile-^> newFile:"%%i" -^> "!file!.%newFExt%"
)
)
)
:end
set /a a-=1
echo 總處理文件數:!ttl! ,處理成功數:!a!
endlocal
pause
goto :eof
rem ---------檢查文件名-------參數帶雙引号---------------
:checkFileChar
rem set proVar=%1& set proVar=!proVar:~1,-1! 也可寫成這樣
set proVar=%~1
rem set proVar=!proVar:~1,-1! 去掉雙引号,效果同%~1
set noCharTmp=%2
set cnt2=0
set retVal=0
:cyc2
if "!proVar:~%cnt2%,1!"=="" (set retVal=0&goto :eof)
rem echo 第%cnt2%個字符:"!proVar:~%cnt2%,1!","!proVar!",%proVar%,傳入參數:%1,最後一個字符:'%proVar:~-1%'
set cnt3=0
:cyc3
rem echo 第%cnt3%個排除字符:"!noCharTmp:~%cnt3%,1!"
if "!noCharTmp:~%cnt3%,1!"=="" (set retVal=0&set /a cnt2 =1 &goto cyc2)
if "!noCharTmp:~%cnt3%,1!"=="!proVar:~%cnt2%,1!" (
set retVal=1
goto :eof
) else (set /a cnt3 =1
goto cyc3 )
rem ---------檢查擴展名-------參數帶雙引号--------------
rem ----- 隻能輸入0-9,A-Z,a-z,(原文件加:*、?) -----------
:checkExtChar
rem set proVar2=%1 & set proVar2=!proVar2:~1,-2! 此行問題:在%1 &間有一個空格
set proVar2=%~1
rem set proVar2=%proVar2:~1,-1%
set flag=%2
set cnt4=0
set retVal=0
:cyc4
rem echo %cnt4% "!proVar2:~%cnt4%,1!"
if "!proVar2:~%cnt4%,1!"=="" (set retVal=0&goto :eof)
rem if %flag%=="O" (
rem if "!proVar2:~%cnt4%,1!"=="*" (set /a cnt4 =1&goto cyc4
rem ) else if "!proVar2:~%cnt4%,1!"=="?" (set /a cnt4 =1&goto cyc4) )
if "!proVar2:~%cnt4%,1!" LSS "0" (set retVal=1&goto :eof)
if /i "!proVar2:~%cnt4%,1!" GTR "z" (set retVal=1&goto :eof)
if "!proVar2:~%cnt4%,1!" GTR "9" (
if /i "!proVar2:~%cnt4%,1!" LSS "a" (set retVal=1&goto :eof))
rem if "!proVar2:~%cnt4%,1!" GTR "Z" (
rem if "!proVar2:~%cnt4%,1!" LSS "a" (set retVal=1&goto :eof))
rem echo %cnt4% "!proVar2:~%cnt4%,1!" 4
set /a cnt4 =1
goto cyc4
注意:要确保将此批處理文件放在需要改名的文件夾下,盡量不要輸入DOS命令中的特殊字符,如 *./^ \ | 等。
findstr相關補充說明:默認啟用正則表達式
"/L" :如果要關閉正則表達式,即把^$\<.*等當成普通的字符,則用/L開關
此處的$不在用于判斷“ese”是最後字符了
".*" : 代表所有
"/c:" : 使用指定字符串作為文字搜索字符串,搜索字符串中的"."或"*"等符号不再是通配符,隻是普通的句号、星号字符
"/d" : 從用分号分隔的指定目錄裡查找所有txt文件裡的“hello”字符串
"/a:attr" : 指定目錄和文件名的顔色,有兩個字符時,第一個表示底色,第二個表示字體顔色,查color /?可知顔色代碼如下:
另外,下一目錄為什麼接在上一行的後面?是因為上一行最後沒有回車引起的
"/f:file" : 将要查找範圍内的文件名存放在一個文件中“file”中,從這些文件中搜索“hello”
findstr的詳細用法請參照:DOS批處理命令:強大的find及findstr查找字符串搜索,坑也不少
,
更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!