标题: [文件操作] [已解决]bat批处理代码排除筛选要怎么写? [打印本页]
作者: 1989615wx 时间: 2023-5-28 13:59 标题: [已解决]bat批处理代码排除筛选要怎么写?
本帖最后由 1989615wx 于 2023-5-29 19:44 编辑
例如:pdf文件,如果文件名里面没有‘已处理’这3个字,就自动在文件名的最前面添加‘待处理’这3个字
作者: 77七 时间: 2023-5-28 15:12
- @echo off
- rem 保存为ansi编码
- for /f "delims=" %%i in ('dir /b /a-d *.pdf ^|find /v "已处理" ^|find /v "待处理"') do (
- ren "%%i" "待处理%%~nxi"
- )
- pause
复制代码
作者: 1989615wx 时间: 2023-5-28 16:23
本帖最后由 1989615wx 于 2023-5-28 16:24 编辑
回复 2# 77七
你好 替换成你的代码以后,我原本有一条代码就失效了,能否帮我看看,就是下面第45行的代码,输入了以后没反应了。- @echo off
- title !!不删!!点我批量在文件名前添加前缀.bat
- color F0
- echo 1、【原点印务】
- echo 2、【百姓印务】
- echo 3、【鑫金星:760】
- echo 4、【鑫金星:1030】
- echo 5、【雅美高】
- echo 6、【华印汇彩】
- echo 7、【华美丰:460】
- echo 8、【华美丰:620】
- echo 9、【华美丰:920】
- echo 10、【添加自定义文字】
- echo 00、【撤销添加的前缀】
- echo,&set /p xz=请输入数字后回车:
- if /i "%xz%"=="1" for /f "delims=" %%i in ('dir /b /a-d *.pdf ^|find /v "文件名" ^|find /v "1030_790_原点印务__文件名:"') do (
- ren "%%i" "1030_790_原点印务__文件名:%%~nxi"
- )
- if /i "%xz%"=="2" for /f "delims=" %%i in ('dir /b /a-d *.pdf ^|find /v "文件名" ^|find /v "1030_800_百姓印务__文件名:"') do (
- ren "%%i" "1030_800_百姓印务__文件名:%%~nxi"
- )
- if /i "%xz%"=="3" for /f "delims=" %%i in ('dir /b /a-d *.pdf ^|find /v "文件名" ^|find /v "760_605_鑫金星__文件名:"') do (
- ren "%%i" "760_605_鑫金星__文件名:%%~nxi"
- )
- if /i "%xz%"=="4" for /f "delims=" %%i in ('dir /b /a-d *.pdf ^|find /v "文件名" ^|find /v "1030_800_鑫金星__文件名:"') do (
- ren "%%i" "1030_800_鑫金星__文件名:%%~nxi"
- )
- if /i "%xz%"=="5" for /f "delims=" %%i in ('dir /b /a-d *.pdf ^|find /v "文件名" ^|find /v "1030_790_雅美高__文件名:"') do (
- ren "%%i" "1030_790_雅美高__文件名:%%~nxi"
- )
- if /i "%xz%"=="6" for /f "delims=" %%i in ('dir /b /a-d *.pdf ^|find /v "文件名" ^|find /v "910_665_华印汇彩__文件名:"') do (
- ren "%%i" "910_665_华印汇彩__文件名:%%~nxi"
- )
- if /i "%xz%"=="7" for /f "delims=" %%i in ('dir /b /a-d *.pdf ^|find /v "文件名" ^|find /v "460_395_华美丰__文件名:"') do (
- ren "%%i" "460_395_华美丰__文件名:%%~nxi"
- )
- if /i "%xz%"=="8" for /f "delims=" %%i in ('dir /b /a-d *.pdf ^|find /v "文件名" ^|find /v "620_485_华美丰__文件名:"') do (
- ren "%%i" "620_485_华美丰__文件名:%%~nxi"
- )
- if /i "%xz%"=="9" for /f "delims=" %%i in ('dir /b /a-d *.pdf ^|find /v "文件名" ^|find /v "920_760_华美丰__文件名:"') do (
- ren "%%i" "920_760_华美丰__文件名:%%~nxi"
- )
-
- if /i "%xz%"=="10" echo,&set /p targetDate=请输入自定义文字:
- if /i "%xz%"=="10" for /f "delims=" %%f in ('dir/b/a-d *.pdf*') do (if not "%%~nxf"=="%0" ren "%%f" "%targetDate%%%~nxf")
-
- if /i "%xz%"=="00" for /f "delims=" %%i in ('dir /b /a-d *.pdf') do (
- set "newName=%%~nxi"
- set "oldName=%%~fi"
- setlocal enabledelayedexpansion
- for /l %%l in (1,1,10) do (
- set "newName=!newName:*:=!"
- )
- echo ren "!oldName!" "!newName!"
- ren "!oldName!" "!newName!"
- endlocal
- )
- exit
复制代码
作者: 77七 时间: 2023-5-28 17:01
回复 3# 1989615wx
去掉这个判断吧复制代码
这个是排除批处理自身,这里不需要
可以试下 %~0 %0 %~nx0 区别
作者: qixiaobin0715 时间: 2023-5-29 09:50
回复 2# 77七
用findstr可以省掉一个管道命令:- 'dir /b /a-d *.pdf ^|findstr /rv "已处理 待处理"'
复制代码
作者: 77七 时间: 2023-5-29 10:53
回复 5# qixiaobin0715
谢谢大佬指导!我写的时候试过用findstr,没写对,所以用了两个find,我得去仔细学习下findstr命令。
作者: buyiyang 时间: 2023-5-29 12:47
回复 6# 77七
findstr搜索以空格分隔的多个字符,要使用/i或/r参数才奏效,而且findstr只能搜索ansi编码字符,find可以搜索其他编码的字符和文本。
作者: 77七 时间: 2023-5-29 13:14
回复 7# buyiyang
谢谢大佬指导!以前只知道用findstr /r 搜索多个汉字字符串,原来/i也可以,学习了!
作者: qixiaobin0715 时间: 2023-5-29 13:38
本帖最后由 qixiaobin0715 于 2023-5-30 09:31 编辑
回复 3# 1989615wx
实际上代码可以这样精简,可能显示有些差异,对”添加自定义文字“、”撤销添加的前缀“不知我理解的是否正确。未经测试:- @echo off
- setlocal enabledelayedexpansion
- set Pre=1030_790_原点印务 1030_800_百姓印务 760_605_鑫金星 1030_800_鑫金星 1030_790_雅美高 910_665_华印汇彩 460_395_华美丰 620_485_华美丰 920_760_华美丰
- for %%a in (%Pre%) do (
- set /a n+=1
- set _!n!=%%a
- echo,!n!、 【%%a】
- )
- echo,10、【添加自定义文字】
- echo,00、【撤销添加的前缀】
- echo,&set /p xz=请输入数字后回车:
- if %xz% equ 10 (
- echo,
- set /p targetDate=请输入自定义文字:
- for /f "delims=" %%i in ('dir /b /a-d *.pdf') do ren "%%i" "!targetDate!%%i"
- ) else if "%xz%"=="00" (
- for /f "delims=" %%i in ('dir /b /a-d *:*.pdf') do (
- set "str=%%i"
- set "str=!str::=\!"
- for %%j in ("!str!") do ren "%%i" "%%~nxj"
- )
- ) else (
- for /f "delims=" %%i in ('dir /b /a-d *.pdf^|find /v "文件名:"') do ren "%%i" "!_%xz%!_文件名:%%i"
- )
- pause
复制代码
作者: xp3000 时间: 2023-5-29 17:15
- @if (0)==(0) echo off
- rem 保存为ANSI编码
-
- :start
- cls
- echo 1、【原点印务】
- echo 2、【百姓印务】
- echo 3、【鑫金星:760】
- echo 4、【鑫金星:1030】
- echo 5、【雅美高】
- echo 6、【华印汇彩】
- echo 7、【华美丰:460】
- echo 8、【华美丰:620】
- echo 9、【华美丰:920】
- echo 10、【添加自定义文字】
- echo 00、【撤销添加的前缀】
- echo.
- set/p p=请选择[1/2/3/4/5/6/7/8/9/10/00]:
- echo.
- if %p%==1 set "var1=1030_790_原点印务__文件名:" & goto to
- if %p%==2 set "var1=1030_800_百姓印务__文件名:" & goto to
- if %p%==3 set "var1=760_605_鑫金星__文件名:" & goto to
- if %p%==4 set "var1=1030_800_鑫金星__文件名:" & goto to
- if %p%==5 set "var1=1030_790_雅美高__文件名:" & goto to
- if %p%==6 set "var1=910_665_华印汇彩__文件名:" & goto to
- if %p%==7 set "var1=460_395_华美丰__文件名:" & goto to
- if %p%==8 set "var1=620_485_华美丰__文件名:" & goto to
- if %p%==9 set "var1=920_760_华美丰__文件名:" & goto to
- if %p%==10 set /p "var1=添加自定义文字:" & goto to
- if %p%==00 set /p "var2=撤销添加的前缀:" & goto to
- goto start
-
- :to
- dir /b "*.pdf" | cscript //nologo //e:jscript "%~0" "%var1%" "%var2%"
- pause & goto :EOF
- @end
-
- fso = new ActiveXObject("Scripting.FileSystemObject");
-
- while(!WScript.StdIn.AtEndOfStream){
- var name = WSH.StdIn.ReadLine();
- if (WSH.Arguments(1) === '') {
- str = name.match(WSH.Arguments(0))
- if (str === null) {
- Newname = WSH.Arguments(0) + name;//添加内容
- if (!fso.FileExists(Newname)) {fso.MoveFile(name, Newname);}
- WSH.echo('新文件名:' + Newname);
- }
- } else {
- Newname = name.replace(WSH.Arguments(1), "");//删除内容
- if (!fso.FileExists(Newname)) {fso.MoveFile(name, Newname);}
- WSH.echo('新文件名:' + Newname);
- }
- }
- WSH.echo("批量处理完成");
复制代码
作者: 1989615wx 时间: 2023-5-29 18:56
回复 9# qixiaobin0715
感谢帮助!测试了下,执行以后有些文件的后缀名被删了...
作者: qixiaobin0715 时间: 2023-5-30 09:31
本帖最后由 qixiaobin0715 于 2023-5-30 13:56 编辑
回复 11# 1989615wx
重新检查了代码,你是不是输入00,要撤销添加前缀会出现此种现象,如果是这样的话,就把代码第20行中的!str!加上引号,看看是否能解决问题。楼上代码已修改。
作者: 1989615wx 时间: 2023-5-30 17:43
回复 12# qixiaobin0715
的确是的,加上!str!引号就解决了,你的代码优化的挺棒!! 目前还有一个小问题,就是代码运行后需要按任意键进行二次确认,这一步有些多余,可否去掉,感谢!
作者: jyswjjgdwtdtj 时间: 2023-5-30 19:28
本帖最后由 jyswjjgdwtdtj 于 2023-5-30 19:31 编辑
嘿嘿 虽然已经解决了- 'vbscript
- Set shell = CreateObject("shell.application")
- Set pdfs = shell.namespace(Replace(WScript.scriptfullname,WScript.scriptname,"")).items
- pdfs.Filter 128,"*.pdf"
- For Each pdf In pdfs
- If InStr(pdf.name,"已处理") = -1 Then
- pdf.name = "待处理" + pdf.name
- End If
- Next
复制代码
作者: xp3000 时间: 2023-5-30 20:02
保存为ANSI编码的BAT- @if (0)==(0) echo off
- dir /b "*.pdf" | cscript //nologo //e:jscript "%~0"
- pause & goto :EOF
- @end
-
- fso = new ActiveXObject("Scripting.FileSystemObject");
- while(!WScript.StdIn.AtEndOfStream){
- var name = WSH.StdIn.ReadLine();
- var str = name.match(/已处理/);
- if (!str) {
- Newname = "待处理 " + name.replace(/(待处理 *)+/g, '');
- if (!fso.FileExists(Newname)) {
- fso.MoveFile(name, Newname);
- WSH.Echo(Newname);
- }}
- }
复制代码
补发一个昨天漏掉的问题
作者: jyswjjgdwtdtj 时间: 2023-5-30 20:45
回复 15# xp3000
文件重命名可以直接file.name="1.txt" 不需要movefile
作者: qixiaobin0715 时间: 2023-5-31 08:53
回复 13# 1989615wx
pause是暂停的意思,去掉即可。
欢迎光临 批处理之家 (http://bbs.bathome.net/) |
Powered by Discuz! 7.2 |