tft每日頭條

 > 科技

 > 批處理如何逐行提取文件内容

批處理如何逐行提取文件内容

科技 更新时间:2024-12-23 06:00:41

(建議用電腦浏覽本文效果更好)

自己編寫的一個DOS批處理,用于批量修改文件名或擴展名。

實現邏輯

批處理如何逐行提取文件内容(電腦裡批量修改文件名)1

操作:批處理運行後會在當前文件夾下生成一個錯誤信息文件batResult.txt

字符替換:

示例一:将文件名中的“5”替換成“99”

批處理如何逐行提取文件内容(電腦裡批量修改文件名)2

原文件

運行批處理文件batRename2.bat:

批處理如何逐行提取文件内容(電腦裡批量修改文件名)3

結果:

批處理如何逐行提取文件内容(電腦裡批量修改文件名)4

示例二:将“廢柴兄弟”改成“上海灘”,并将擴展名改為“bat”

批處理如何逐行提取文件内容(電腦裡批量修改文件名)5

操作:

批處理如何逐行提取文件内容(電腦裡批量修改文件名)6

結果:

批處理如何逐行提取文件内容(電腦裡批量修改文件名)7

改成新文件名:将所有擴展名為bat文件改成新文件名newBAT,後綴改為ttt

批處理如何逐行提取文件内容(電腦裡批量修改文件名)8

操作:

批處理如何逐行提取文件内容(電腦裡批量修改文件名)9

結果:

批處理如何逐行提取文件内容(電腦裡批量修改文件名)10

批處理如何逐行提取文件内容(電腦裡批量修改文件名)11

程序實現方法一

@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開關

批處理如何逐行提取文件内容(電腦裡批量修改文件名)12

此處的$不在用于判斷“ese”是最後字符了

".*" : 代表所有

"/c:" : 使用指定字符串作為文字搜索字符串,搜索字符串中的"."或"*"等符号不再是通配符,隻是普通的句号、星号字符

批處理如何逐行提取文件内容(電腦裡批量修改文件名)13

"/d" : 從用分号分隔的指定目錄裡查找所有txt文件裡的“hello”字符串

批處理如何逐行提取文件内容(電腦裡批量修改文件名)14

"/a:attr" : 指定目錄和文件名的顔色,有兩個字符時,第一個表示底色,第二個表示字體顔色,查color /?可知顔色代碼如下:

  • 0 = 黑色 8 = 灰色
  • 1 = 藍色 9 = 淡藍色
  • 2 = 綠色 A = 淡綠色
  • 3 = 淺綠色 B = 淡淺綠色
  • 4 = 紅色 C = 淡紅色
  • 5 = 紫色 D = 淡紫色
  • 6 = 黃色 E = 淡黃色
  • 7 = 白色 F = 亮白色

批處理如何逐行提取文件内容(電腦裡批量修改文件名)15

另外,下一目錄為什麼接在上一行的後面?是因為上一行最後沒有回車引起的

"/f:file" : 将要查找範圍内的文件名存放在一個文件中“file”中,從這些文件中搜索“hello”

批處理如何逐行提取文件内容(電腦裡批量修改文件名)16

批處理如何逐行提取文件内容(電腦裡批量修改文件名)17

findstr的詳細用法請參照:DOS批處理命令:強大的find及findstr查找字符串搜索,坑也不少

批處理如何逐行提取文件内容(電腦裡批量修改文件名)18

,

更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!

查看全部

相关科技资讯推荐

热门科技资讯推荐

网友关注

Copyright 2023-2024 - www.tftnews.com All Rights Reserved