[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[文件操作] [已解决]bat批处理代码排除筛选要怎么写?

本帖最后由 1989615wx 于 2023-5-29 19:44 编辑

例如:pdf文件,如果文件名里面没有‘已处理’这3个字,就自动在文件名的最前面添加‘待处理’这3个字
1

评分人数

    • Batcher: 感谢给帖子标题标注[已解决]字样PB + 2

  1. @echo off
  2. rem 保存为ansi编码
  3. for /f "delims=" %%i in ('dir /b /a-d *.pdf ^|find /v "已处理" ^|find /v "待处理"') do (
  4. ren "%%i" "待处理%%~nxi"
  5. )
  6. pause
复制代码
bat小白,请多指教!谢谢!

TOP

本帖最后由 1989615wx 于 2023-5-28 16:24 编辑

回复 2# 77七


你好 替换成你的代码以后,我原本有一条代码就失效了,能否帮我看看,就是下面第45行的代码,输入了以后没反应了。
  1. @echo off
  2. title !!不删!!点我批量在文件名前添加前缀.bat
  3. color F0
  4. echo   1、【原点印务】
  5. echo   2、【百姓印务】
  6. echo   3、【鑫金星:760】
  7. echo   4、【鑫金星:1030】
  8. echo   5、【雅美高】
  9. echo   6、【华印汇彩】
  10. echo   7、【华美丰:460】
  11. echo   8、【华美丰:620】
  12. echo   9、【华美丰:920】
  13. echo  10、【添加自定义文字】
  14. echo  00、【撤销添加的前缀】
  15. echo,&set /p xz=请输入数字后回车:
  16. if /i "%xz%"=="1" for /f "delims=" %%i in ('dir /b /a-d *.pdf ^|find /v "文件名" ^|find /v "1030_790_原点印务__文件名:"') do (
  17. ren "%%i" "1030_790_原点印务__文件名:%%~nxi"
  18. )
  19. if /i "%xz%"=="2" for /f "delims=" %%i in ('dir /b /a-d *.pdf ^|find /v "文件名" ^|find /v "1030_800_百姓印务__文件名:"') do (
  20. ren "%%i" "1030_800_百姓印务__文件名:%%~nxi"
  21. )
  22. if /i "%xz%"=="3" for /f "delims=" %%i in ('dir /b /a-d *.pdf ^|find /v "文件名" ^|find /v "760_605_鑫金星__文件名:"') do (
  23. ren "%%i" "760_605_鑫金星__文件名:%%~nxi"
  24. )
  25. if /i "%xz%"=="4" for /f "delims=" %%i in ('dir /b /a-d *.pdf ^|find /v "文件名" ^|find /v "1030_800_鑫金星__文件名:"') do (
  26. ren "%%i" "1030_800_鑫金星__文件名:%%~nxi"
  27. )
  28. if /i "%xz%"=="5" for /f "delims=" %%i in ('dir /b /a-d *.pdf ^|find /v "文件名" ^|find /v "1030_790_雅美高__文件名:"') do (
  29. ren "%%i" "1030_790_雅美高__文件名:%%~nxi"
  30. )
  31. if /i "%xz%"=="6" for /f "delims=" %%i in ('dir /b /a-d *.pdf ^|find /v "文件名" ^|find /v "910_665_华印汇彩__文件名:"') do (
  32. ren "%%i" "910_665_华印汇彩__文件名:%%~nxi"
  33. )
  34. if /i "%xz%"=="7" for /f "delims=" %%i in ('dir /b /a-d *.pdf ^|find /v "文件名" ^|find /v "460_395_华美丰__文件名:"') do (
  35. ren "%%i" "460_395_华美丰__文件名:%%~nxi"
  36. )
  37. if /i "%xz%"=="8" for /f "delims=" %%i in ('dir /b /a-d *.pdf ^|find /v "文件名" ^|find /v "620_485_华美丰__文件名:"') do (
  38. ren "%%i" "620_485_华美丰__文件名:%%~nxi"
  39. )
  40. if /i "%xz%"=="9" for /f "delims=" %%i in ('dir /b /a-d *.pdf ^|find /v "文件名" ^|find /v "920_760_华美丰__文件名:"') do (
  41. ren "%%i" "920_760_华美丰__文件名:%%~nxi"
  42. )
  43. if /i "%xz%"=="10" echo,&set /p targetDate=请输入自定义文字:
  44. if /i "%xz%"=="10" for /f "delims=" %%f in ('dir/b/a-d *.pdf*') do (if not "%%~nxf"=="%0" ren "%%f" "%targetDate%%%~nxf")
  45. if /i "%xz%"=="00" for /f "delims=" %%i in ('dir /b /a-d *.pdf') do (
  46. set "newName=%%~nxi"
  47. set "oldName=%%~fi"
  48. setlocal enabledelayedexpansion
  49. for /l %%l in (1,1,10) do (
  50. set "newName=!newName:*:=!"
  51. )
  52. echo ren "!oldName!" "!newName!"
  53. ren "!oldName!" "!newName!"
  54. endlocal
  55. )
  56. exit
复制代码

TOP

回复 3# 1989615wx


   去掉这个判断吧
  1. if not "%%~nxf"=="%0"
复制代码


这个是排除批处理自身,这里不需要
可以试下 %~0 %0 %~nx0 区别
1

评分人数

    • 1989615wx: 感谢帮助!删掉这段以后果然就好了技术 + 1
bat小白,请多指教!谢谢!

TOP

回复 2# 77七
用findstr可以省掉一个管道命令:
  1. 'dir /b /a-d *.pdf ^|findstr /rv "已处理 待处理"'
复制代码

TOP

回复 5# qixiaobin0715


   谢谢大佬指导!我写的时候试过用findstr,没写对,所以用了两个find,我得去仔细学习下findstr命令。
bat小白,请多指教!谢谢!

TOP

回复 6# 77七


    findstr搜索以空格分隔的多个字符,要使用/i或/r参数才奏效,而且findstr只能搜索ansi编码字符,find可以搜索其他编码的字符和文本。

TOP

回复 7# buyiyang


谢谢大佬指导!以前只知道用findstr /r 搜索多个汉字字符串,原来/i也可以,学习了!
bat小白,请多指教!谢谢!

TOP

本帖最后由 qixiaobin0715 于 2023-5-30 09:31 编辑

回复 3# 1989615wx
实际上代码可以这样精简,可能显示有些差异,对”添加自定义文字“、”撤销添加的前缀“不知我理解的是否正确。未经测试:
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. set Pre=1030_790_原点印务 1030_800_百姓印务 760_605_鑫金星 1030_800_鑫金星 1030_790_雅美高 910_665_华印汇彩 460_395_华美丰 620_485_华美丰 920_760_华美丰
  4. for %%a in (%Pre%) do (
  5.     set /a n+=1
  6.     set _!n!=%%a
  7.     echo,!n!、 【%%a】
  8. )
  9. echo,10、【添加自定义文字】
  10. echo,00、【撤销添加的前缀】
  11. echo,&set /p xz=请输入数字后回车:
  12. if %xz% equ 10 (
  13.     echo,
  14.     set /p targetDate=请输入自定义文字:
  15.     for /f "delims=" %%i in ('dir /b /a-d *.pdf') do ren "%%i" "!targetDate!%%i"
  16. ) else if "%xz%"=="00" (
  17.     for /f "delims=" %%i in ('dir /b /a-d *:*.pdf') do (
  18.         set "str=%%i"
  19.         set "str=!str::=\!"
  20.         for %%j in ("!str!") do ren "%%i" "%%~nxj"
  21.     )
  22. ) else (
  23.     for /f "delims=" %%i in ('dir /b /a-d *.pdf^|find /v "文件名:"') do ren "%%i" "!_%xz%!_文件名:%%i"
  24. )
  25. pause
复制代码
1

评分人数

TOP

  1. @if (0)==(0) echo off
  2. rem 保存为ANSI编码
  3. :start
  4. cls
  5. echo   1、【原点印务】
  6. echo   2、【百姓印务】
  7. echo   3、【鑫金星:760】
  8. echo   4、【鑫金星:1030】
  9. echo   5、【雅美高】
  10. echo   6、【华印汇彩】
  11. echo   7、【华美丰:460】
  12. echo   8、【华美丰:620】
  13. echo   9、【华美丰:920】
  14. echo  10、【添加自定义文字】
  15. echo  00、【撤销添加的前缀】
  16. echo.
  17. set/p p=请选择[1/2/3/4/5/6/7/8/9/10/00]:
  18. echo.
  19. if %p%==1 set "var1=1030_790_原点印务__文件名:" & goto to
  20. if %p%==2 set "var1=1030_800_百姓印务__文件名:" & goto to
  21. if %p%==3 set "var1=760_605_鑫金星__文件名:" & goto to
  22. if %p%==4 set "var1=1030_800_鑫金星__文件名:" & goto to
  23. if %p%==5 set "var1=1030_790_雅美高__文件名:" & goto to
  24. if %p%==6 set "var1=910_665_华印汇彩__文件名:" & goto to
  25. if %p%==7 set "var1=460_395_华美丰__文件名:" & goto to
  26. if %p%==8 set "var1=620_485_华美丰__文件名:" & goto to
  27. if %p%==9 set "var1=920_760_华美丰__文件名:" & goto to
  28. if %p%==10 set /p "var1=添加自定义文字:" & goto to
  29. if %p%==00 set /p "var2=撤销添加的前缀:" & goto to
  30. goto start
  31. :to
  32. dir /b "*.pdf" | cscript //nologo //e:jscript "%~0" "%var1%" "%var2%"
  33. pause & goto :EOF
  34. @end
  35. fso = new ActiveXObject("Scripting.FileSystemObject");
  36. while(!WScript.StdIn.AtEndOfStream){
  37. var name = WSH.StdIn.ReadLine();
  38. if (WSH.Arguments(1) === '') {
  39.     str = name.match(WSH.Arguments(0))
  40. if (str === null) {
  41.     Newname = WSH.Arguments(0) + name;//添加内容
  42.     if (!fso.FileExists(Newname)) {fso.MoveFile(name, Newname);}
  43.     WSH.echo('新文件名:' + Newname);
  44.     }
  45. } else {
  46.     Newname = name.replace(WSH.Arguments(1), "");//删除内容
  47.     if (!fso.FileExists(Newname)) {fso.MoveFile(name, Newname);}
  48.     WSH.echo('新文件名:' + Newname);
  49. }
  50. }
  51. WSH.echo("批量处理完成");
复制代码

TOP

回复 9# qixiaobin0715


    感谢帮助!测试了下,执行以后有些文件的后缀名被删了...

TOP

本帖最后由 qixiaobin0715 于 2023-5-30 13:56 编辑

回复 11# 1989615wx
重新检查了代码,你是不是输入00,要撤销添加前缀会出现此种现象,如果是这样的话,就把代码第20行中的!str!加上引号,看看是否能解决问题。楼上代码已修改。

TOP

回复 12# qixiaobin0715




    的确是的,加上!str!引号就解决了,你的代码优化的挺棒!! 目前还有一个小问题,就是代码运行后需要按任意键进行二次确认,这一步有些多余,可否去掉,感谢!

TOP

本帖最后由 jyswjjgdwtdtj 于 2023-5-30 19:31 编辑

嘿嘿 虽然已经解决了
  1. 'vbscript
  2. Set shell = CreateObject("shell.application")
  3. Set pdfs = shell.namespace(Replace(WScript.scriptfullname,WScript.scriptname,"")).items
  4. pdfs.Filter 128,"*.pdf"
  5. For Each pdf In pdfs
  6.   If InStr(pdf.name,"已处理") = -1 Then
  7.     pdf.name = "待处理" + pdf.name
  8.   End If
  9. Next
复制代码

TOP

保存为ANSI编码的BAT
  1. @if (0)==(0) echo off
  2. dir /b "*.pdf" | cscript //nologo //e:jscript "%~0"
  3. pause & goto :EOF
  4. @end
  5. fso = new ActiveXObject("Scripting.FileSystemObject");
  6. while(!WScript.StdIn.AtEndOfStream){
  7. var name = WSH.StdIn.ReadLine();
  8. var str = name.match(/已处理/);
  9. if (!str) {
  10.     Newname = "待处理 " + name.replace(/(待处理 *)+/g, '');
  11. if (!fso.FileExists(Newname)) {
  12.     fso.MoveFile(name, Newname);
  13.     WSH.Echo(Newname);
  14.     }}
  15. }
复制代码
补发一个昨天漏掉的问题

TOP

返回列表