标题: [文件操作] BAT脚本FOR遍历,删除文件,怎样排除目录和文件? [打印本页]
作者: 7758234 时间: 2023-8-29 14:35 标题: BAT脚本FOR遍历,删除文件,怎样排除目录和文件?
排除C盘下指定目录下所有的PDF DOC XLS文件,进行遍历C盘、D盘、E盘所有PDF、DOC、XLS文件,进行删除处理
作者: 77七 时间: 2023-8-29 15:40
本帖最后由 77七 于 2023-8-29 17:00 编辑
- @echo off
- rem 批处理保存为ansi编码格式。
- for /r "C:\指定目录" %%i in (*.pdf *.doc *.xls) do set _"%%i"=1
- for %%a in (c d e) do call :1 "%%a:\"
- pause
- exit
-
- :1
- for /r "%~1" %%b in (*.pdf *.doc *.xls) do (
- if not defined _"%%b" (
- rem 效果满意,则删除echo再执行
- echo del "%%b"
- )
- )
- exit /b
复制代码
代码有问题,参考5楼。
作者: qixiaobin0715 时间: 2023-8-29 15:48
回复 1# 7758234
这种操作还是要小心,一旦删错文件,后悔晚矣!!!
作者: Batcher 时间: 2023-8-29 16:11
回复 1# 7758234
请参考Q-04把bat文件保存为ANSI编码:
https://mp.weixin.qq.com/s/Koje4FufWxWBs7ioDy_LJA- @echo off
- REM 设置待排除的目录(注意以\结尾)
- set "ExFolder=C:\Users\Administrator\Desktop\"
- for %%a in (C D E) do (
- if exist %%a:\ (
- echo 正在搜索%%a:\
- pushd %%a:\
- for /f "delims=" %%b in ('dir /b /s /a-d *.pdf *.doc *.xls 2^>nul ^| find /v /i "%ExFolder%"') do (
- REM 如果显示的结果没有问题,把下面的echo去掉再次执行即可删除文件
- echo del /f /q "%%b"
- )
- popd
- )
- )
- pause
复制代码
作者: Batcher 时间: 2023-8-29 16:12
回复 2# 77七
如果待排除的文件较多,可能超出变量上限。
作者: 77七 时间: 2023-8-29 17:00
回复 5# Batcher
谢谢站长指点!没考虑到指定目录下会存在大量待排除文件。
作者: 77七 时间: 2023-8-29 17:01
本帖最后由 77七 于 2023-8-29 17:08 编辑
重来一个。- @echo off
- rem 批处理保存为ansi编码格式。请谨慎使用!
- set "folder=C:\指定目录"
- for %%a in (pdf doc xls) do attrib +H "%folder%\*.%%a" /s
- echo 确认待排除文件隐藏成功,则继续执行
- pause
- for %%a in (c d e) do (
- pushd "%%a:\"
- del /s /q *.pdf;*.doc;*.xls
- popd
- )
- for %%a in (pdf doc xls) do attrib -H "%folder%\*.%%a" /s
- pause
复制代码
作者: 7758234 时间: 2023-8-29 17:09
回复 7# 77七
谢谢,这个我看明白了,排除文件添加隐藏属性,好办法,今天又学习了
作者: buyiyang 时间: 2023-8-29 17:46
本帖最后由 buyiyang 于 2023-8-30 11:04 编辑
试试wmic,遍历所有盘- @echo off
- rem 指定排除目录
- set "exfolder=C:\Windows\"
-
- set "exfolder=%exfolder:\=\\%"
- wmic datafile where "not name like '%exfolder%%%' and (Extension='pdf' or Extension='doc' or Extension='xls')" get name /value | findstr .
- pause
- pause>nul&echo,确认删除?
- pause>nul&echo,确认删除?
- wmic datafile where "not name like '%exfolder%%%' and (Extension='pdf' or Extension='doc' or Extension='xls')" call delete
复制代码
作者: 7758234 时间: 2023-8-30 10:10
回复 4# Batcher
站长,您好,请问多个目录要如何配置添加?
作者: 7758234 时间: 2023-8-30 10:29
回复 9# buyiyang
我测试,执行,提示
节点 - CSG21659Q5
错误:
描述 = 无效查询
请按任意键继续. . .
作者: 7758234 时间: 2023-8-30 10:33
回复 7# 77七
你好,如果多个目录要如何设置添加
作者: 77七 时间: 2023-8-30 10:43
回复 12# 7758234
- @echo off
- rem 批处理保存为ansi编码格式。请谨慎使用!
- set "folder1=C:\指定目录1"
- set "folder2=C:\指定目录2"
- for %%a in (pdf doc xls) do (
- attrib +H "%folder1%\*.%%a" /s
- attrib +H "%folder2%\*.%%a" /s
- )
- echo 确认待排除文件隐藏成功,则继续执行
- pause
- for %%a in (c d e) do (
- pushd "%%a:\"
- del /s /q *.pdf;*.doc;*.xls
- popd
- )
- for %%a in (pdf doc xls) do (
- attrib -H "%folder1%\*.%%a" /s
- attrib -H "%folder2%\*.%%a" /s
- )
- pause
复制代码
作者: Batcher 时间: 2023-8-30 11:13
回复 10# 7758234
方法1.bat- @echo off
- REM 设置待排除的目录(注意以\结尾)
- set "ExFolder1=C:\Users\Administrator\Desktop\"
- set "ExFolder2=C:\Program Files\"
- for %%a in (C D E) do (
- if exist %%a:\ (
- echo 正在搜索%%a:\
- pushd %%a:\
- for /f "delims=" %%b in ('dir /b /s /a-d *.pdf *.doc *.xls 2^>nul ^| find /v /i "%ExFolder1%" ^| find /v /i "%ExFolder2%" ') do (
- REM 如果显示的结果没有问题,把下面的echo去掉再次执行即可删除文件
- echo del /f /q "%%b"
- )
- popd
- )
- )
- pause
复制代码
作者: 7758234 时间: 2023-8-30 11:20
回复 14# Batcher
谢谢
作者: 77七 时间: 2023-8-30 12:10
本帖最后由 77七 于 2023-8-30 12:31 编辑
- @echo off
- rem 批处理保存为ansi编码格式。路径末尾以 \ 结束
- call :1 "c:\指定目录1\"
- call :1 "c:\指定目录2\"
- call :1 "c:\指定目录3\"
-
- for %%a in (c d e) do call :2 "%%a:\"
- pause & exit
-
- :1
- set _"%~1"=1
- rem 如果不需要排除子目录删除下一行
- for /r "%~1" /d %%d in (*) do set _"%%d\"=1
- exit /b
-
- :2
- for /r "%~1" %%i in (*.pdf *.doc *.xls) do (
- if not defined _"%%~dpi" (
- echo del "%%i"
- )
- )
- exit /b
复制代码
改进下2楼代码。如果子目录数量过多,还是会存在变量个数超限问题。单个环境的最大变量大小为 8192 字节。所有变量(包括变量名称和等号)的最大环境变量总大小为 65,536KB。
http://bbs.bathome.net/redirect.php?goto=findpost&ptid=29022&pid=145079
windows路径长度限制260字符。
粗略估算,一般应该不会超限,但是如果子目录数量过万,变量过万,批处理存在效率降低问题。
作者: qixiaobin0715 时间: 2023-8-30 16:56
若指定目录不存在子目录,这样也可。慎用,只是提供一种思路:- @echo off
- set "ExFolder1=指定目录1"(完整路径)
- set "ExFolder2=指定目录2"(完整路径)
- ...
-
- ren "%ExFolder1%\*.*" "*.*.1"
- ren "%ExFolder1%\*.*" "*.*.1"
- ...
-
- for %%i in (C D F) do (
- if exist %%i:\
- for %%j in (pdf doc xls) do (
- del /s %%i:\*.%%j
- )
- )
-
- ren "%ExFolder1%\*.*" "*."
- ren "%ExFolder2%\*.*" "*."
- ...
复制代码
作者: 7758234 时间: 2023-8-31 10:09
回复 14# Batcher
站长其实我们是有个检查,也不想删除这些文件。我有个想法,批量查找出这些文件,把他们命名和后缀输出到xls文件,批处理将他们后缀删除,后续检查过后,恢复他们的后缀格式名,这样也不影响后面的使用。
作者: Batcher 时间: 2023-8-31 10:38
回复 18# 7758234
备份.bat- @echo off
- REM 设置待排除的目录(注意以\结尾)
- set "ExFolder1=C:\Users\Administrator\Desktop\"
- set "ExFolder2=C:\Program Files\"
- REM 导出的文件列表
- set "OutFile=%~dp0备份.csv"
- REM 设置新的临时后缀名
- set "NewExt=ttttt"
- >"%OutFile%" echo OldName,NewName
- for %%a in (C D E) do (
- if exist %%a:\ (
- echo 正在搜索%%a:\
- pushd %%a:\
- for /f "delims=" %%b in ('dir /b /s /a-d *.pdf *.doc *.xls 2^>nul ^| find /v /i "%ExFolder1%" ^| find /v /i "%ExFolder2%" ') do (
- echo 正在查找 %%b
- >>"%OutFile%" echo "%%b","%%b.%NewExt%"
- REM 如果显示的结果没有问题,把下面的echo去掉再次执行即可重命名文件
- echo ren "%%b","%%~nxb.%NewExt%"
- )
- popd
- )
- )
- pause
复制代码
恢复.bat- @echo off
- set "InFile=%~dp0备份.csv"
- for /f skip^=1^ tokens^=3^ delims^=^" %%a in ('type "%InFile%"') do (
- REM 如果显示的结果没有问题,把下面的echo去掉再次执行即可重命名文件
- echo ren "%%a" "%%~na"
- )
- pause
复制代码
作者: 7758234 时间: 2023-8-31 11:48
回复 19# Batcher
站长,但是恢复上就有个问题,文件中存在doc、pdf、xls等文件,批量已命令后缀tttt,恢复应该要读备份CSV进行文件命名才行。单纯通过现有BAT搜索*.tttt命名会有问题。
作者: Batcher 时间: 2023-8-31 11:56
回复 20# 7758234
19楼代码已经更新,可以处理同一个文件夹下包含:
测试.doc
测试.pdf
测试.xls
这种情况
恢复的时候,就是要读取csv文件的NewName和OldName进行重命名。直接搜索.ttttt是不好的方法。
作者: 7758234 时间: 2023-8-31 12:24
回复 21# Batcher
我看了19楼代码了,有点没看懂恢复的处理步骤,改了新命名后,这个批处理怎么去读oldname去恢复
作者: 77七 时间: 2023-8-31 15:31
本帖最后由 77七 于 2023-8-31 15:45 编辑
- @echo off
- rem 批处理保存为ansi编码格式。路径末尾以 \ 结束
- call :1 "c:\指定目录1\"
- call :1 "c:\指定目录2\"
- call :1 "c:\指定目录3\"
-
- for %%a in (c d e) do call :2 "%%a:\"
- pause & exit
-
- :1
- set _"%~1"=1
- rem 如果不需要排除子目录删除下一行
- for /r "%~1" /d %%d in (*) do set _"%%d\"=1
- exit /b
-
- :2
- for /r "%~1" %%i in (*.pdf *.doc *.xls) do (
- if not defined _"%%~dpi" (
- >>"重命名.bat" echo ren "%%i" "%%~ni.tttt"
- >>"恢复.bat" echo ren "%%~dpni.tttt" "%%~nxi"
- )
- )
- exit /b
复制代码
执行后生成两个bat,重命名和恢复
作者: 7758234 时间: 2023-8-31 16:53
回复 23# 77七
我添加了排除e:\1 文件夹,命名还是显示有e盘1文件夹下的文件。
作者: 77七 时间: 2023-8-31 17:04
回复 24# 7758234
rem 批处理保存为ansi编码格式。路径末尾以 \ 结束
call :1 "c:\指定目录1\"
请按这两行的要求、格式修改。
作者: 7758234 时间: 2023-8-31 17:35
回复 25# 77七
是的,我就是按照这个格式去修改。
call :1 "e:\1\"
重命名BAT,就有e盘1目录下的文件包括子目录文件
ren "e:\新建 Microsoft Excel 工作表.xls" "新建 Microsoft Excel 工作表.tttt"
ren "e:\1\新建 Microsoft Word 文档.doc" "新建 Microsoft Word 文档.tttt"
ren "e:\1\2\新建 Microsoft Word 文档.doc" "新建 Microsoft Word 文档.tttt"
作者: Batcher 时间: 2023-8-31 18:01
回复 22# 7758234
请参考19楼:恢复.bat
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |