Board logo

标题: [文件操作] [已解决]批处理如何全盘搜索批量删除几类文件,但要排除某些目录? [打印本页]

作者: locoman    时间: 2019-2-24 15:24     标题: [已解决]批处理如何全盘搜索批量删除几类文件,但要排除某些目录?

本帖最后由 locoman 于 2019-3-17 00:25 编辑

如何实现:全盘搜索批量删除几类文件,但要排除某些目录。

需求:
1. 想全盘搜索*.XLS、*.DOC、*.JPG文件,并将其删除;
2. 但,在执行删除时,又不能删除某些目录内的该几类文件,比如:c:\windows、d:\办公保存、e:\档案保存,等目录下的*.XLS、*.DOC、*.JPG不能删除。

——谢谢大神们帮助我!!

作者: flashercs    时间: 2019-2-24 17:35

a.bat
  1. @echo off
  2. powershell -command "$aExcludes=@('c:\windows','d:\办公保存','e:\档案保存');[System.IO.DriveInfo]::GetDrives()|ForEach-Object{Get-ChildItem -LiteralPath $_.Name -Filter *.* -Directory|Where-Object{$_.FullName -notin $aExcludes}|ForEach-Object{Remove-Item -LiteralPath $_ -Filter *.* -Include *.xls,*.doc,*.jpg -Recurse  -WhatIf}}"
复制代码
测试是否是想要删除的文件,然后再删。
作者: 滴血雄鹰    时间: 2019-2-28 16:50

回复 2# flashercs


   如果批量删除a文件夹及子文件夹下1.bat,代码怎么写?
作者: locoman    时间: 2019-3-6 10:28

回复 2# flashercs

非常感谢您的热情帮助!
因为,主贴的删除需求涉及面很广,且是直接删除了未进入回收站,风险特别大。
所以,我必须向您请教清楚才敢去实测。请见谅!
——
1.您这句是啥意思?——“测试是否是想要删除的文件,然后再删”。
2.您这个代码,能确保需要保护的目录(c:\windows、d:\办公保存、e:\档案保存)不会有删除操作吗?

作者: flashercs    时间: 2019-3-7 16:26

回复 4# locoman


    这代码目前不会删除任何文件的,只是会告诉你将来会删除哪些文件!
若认为删除的文件是正确的,要执行真正删除,请删掉代码后面的 “-WhatIf” 后保存并运行。
作者: locoman    时间: 2019-3-8 15:26

回复 5# flashercs
    谢谢您不厌其烦的帮助我!!谢谢您!
我水平有限,是因为工作中需要,而且是想以批处理文件形式交给同事们去运行完成需求。
将您的代码保存为“指定删除.bat”,运行报错。
有个帖子也曾简介了一下powershell与BAT混用的事儿,但我搞不来。
我就想请您继续帮助我搞成一键点击执行的一个东东(bat),否则,同事们拿到手也搞不来的。
拜托了!

报错——
C:\Users\Administrator.AFOHQ-712210916\Desktop\指定删除>指定删除.bat
必须在“-”运算符的右侧提供值表达式。
所在位置 行:1 字符: 182
+ $aExcludes=@('c:\windows','d:\办公保存','e:\档案保存');[System.IO.DriveInfo]:
:GetDrives()|ForEach-Object{Get-ChildItem -LiteralPath $_.Name -Filter *.* -Dir
ectory|Where-Object{$_.FullName - <<<< notin $aExcludes}|ForEach-Object{Remove-
Item -LiteralPath $_ -Filter *.* -Include *.xlsx,*.doc,*.jpg,*.bmp -Recurse  -W
hatIf}}
    + CategoryInfo          : ParserError: ( [], ParentContainsErrorRecordEx
   ception
    + FullyQualifiedErrorId : ExpectedValueExpression

   

作者: flashercs    时间: 2019-3-8 20:40

回复 6# locoman

用bat也许更好,下面纯批处理,请保存为 文件名.bat
  1. @echo off
  2. setlocal EnableDelayedExpansion
  3. REM 设置要排除的目录列表,用双引号包括,以空格分割.
  4. set dirsExclude="c:\windows" "d:\办公保存" "e:\档案保存"
  5. REM 要删除的文件扩展名列表,用双引号包括,以空格分割.
  6. set exts="*.xls" "*.doc" "*.jpg"
  7. echo 全盘搜索中,请稍候...
  8. for /f "tokens=1*" %%A in ('fsutil fsinfo drives') do (
  9.   for %%D in (%%B) do (
  10.     pushd "%%D"
  11.     for /f "delims=" %%E in ('dir /ad-h-s /b') do (
  12.       set flag=1
  13.       for %%F in (%dirsExclude%) do (
  14.         if /i "%%~fE"==%%F set flag=0
  15.       )
  16.         if !flag!==1 (
  17.           for /f "delims=" %%G in ('where /r "%%~fE" /f %exts% 2^>nul') do (
  18.             REM 若要真正删除文件,请去掉下面这行的 "echo"
  19.             echo del /f /q %%G
  20.           )
  21.         )
  22.       )
  23.     popd
  24.     )
  25.   )
  26. )
  27. endlocal
  28. pause
  29. exit /b
复制代码

作者: locoman    时间: 2019-3-15 11:13

本帖最后由 locoman 于 2019-3-15 11:16 编辑

回复 7# flashercs

谢谢您的热情热心!!
佩服您的精湛技艺!!
前日,家中有要事耽搁,未能好好测试,不好意思!


我简单测试了一下 七楼的代码,您的这个BAT完全按照我的需要能列出需要的文件出来。

——那么,我现在想继续按您的思路,修改为:将列出的路径及文件名保存到一个TXT文件去,如保存到:d:\DEL_list.txt


19行修改为:
echo %%G >>d:\DEL_list.txt

——能实现保存。但有个缺陷:再次运行BAT时,并没有将上次已经存在的d:\DEL_list.txt的内容清空再写入而造成重复内容了。

——但是,我更想进一步完善,需要您再帮我对此优化下,谢谢!

1.首先,我在19行的修改实现,不一定规范标准、效率不一定高;
2.保存到d:\DEL_list.txt时,应该首先有个判断:d:\DEL_list.txt是否存在,存在的话,须先将其内容清空再写入。


——真不好意思多次麻烦您,但为了把一件事搞得更完美和借此向您把问题学习清楚,只能多多麻烦请教了,谢谢您!!
作者: flashercs    时间: 2019-3-16 10:26

回复 8# locoman
  1. @echo off
  2. setlocal EnableDelayedExpansion
  3. REM 设置要排除的目录列表,用双引号包括,以空格分割.
  4. set dirsExclude="c:\windows" "d:\办公保存" "e:\档案保存"
  5. REM 要删除的文件扩展名列表,用双引号包括,以空格分割.
  6. set exts="*.xls" "*.doc" "*.jpg"
  7. REM 设置保存文件路径
  8. set outFile="d:\DEL_list.txt"
  9. echo 全盘搜索中,请稍候...
  10. (
  11.   for /f "tokens=1*" %%A in ('fsutil fsinfo drives') do (
  12.     for %%D in (%%B) do (
  13.       pushd "%%D"
  14.       for /f "delims=" %%E in ('dir /ad-h-s /b') do (
  15.         set flag=1
  16.         for %%F in (%dirsExclude%) do (
  17.           if /i "%%~fE"==%%F set flag=0
  18.         )
  19.           if !flag!==1 (
  20.             for /f "delims=" %%G in ('where /r "%%~fE" /f %exts% 2^>nul') do (
  21.               echo %%G
  22.             )
  23.           )
  24.         )
  25.       popd
  26.       )
  27.     )
  28.   )
  29. )>%outFile%
  30. endlocal
  31. pause
  32. exit /b
复制代码

作者: locoman    时间: 2019-3-16 14:47

本帖最后由 locoman 于 2019-3-16 14:59 编辑

回复 9# flashercs

谢谢您一直热情帮助解决!
将9楼的代码保存为BAT运行后,并没有实现将搜索结果保存到TXT文件,因为,搜索完成后D盘没有“DEL_list.txt”文件。

另外,7楼和9楼的代码,在执行搜索完成后,都会在黑窗口中最后显示一句“设备未就绪。”,不明白这是啥意思?
作者: flashercs    时间: 2019-3-16 17:30

  1. @echo off
  2. setlocal EnableDelayedExpansion
  3. REM 设置要排除的目录列表,用双引号包括,以空格分割.
  4. set dirsExclude="c:\windows" "d:\办公保存" "e:\档案保存"
  5. REM 要删除的文件扩展名列表,用双引号包括,以空格分割.
  6. set exts="*.xls" "*.doc" "*.jpg"
  7. REM 设置保存文件路径
  8. set outFile="d:\DEL_list.txt"
  9. echo 全盘搜索中,请稍候...
  10. (
  11.   for /f "tokens=1*" %%A in ('fsutil fsinfo drives') do (
  12.     for %%D in (%%B) do (
  13.       pushd "%%D"
  14.       for /f "delims=" %%E in ('dir /ad-h-s /b') do (
  15.         set flag=1
  16.         for %%F in (%dirsExclude%) do (
  17.           if /i "%%~fE"==%%F set flag=0
  18.         )
  19.           if !flag!==1 (
  20.             for /f "delims=" %%G in ('where /r "%%~fE" /f %exts% 2^>nul') do (
  21.               echo %%G
  22.             )
  23.           )
  24.         )
  25.       popd
  26.       )
  27.     )
  28. )>%outFile%
  29. endlocal
  30. pause
  31. exit /b
复制代码
设备未就绪,可能是有移动USB硬盘把
作者: locoman    时间: 2019-3-17 00:22

回复 11# flashercs
已经非常完美了!很高兴!
其实,令我更高兴的是在茫茫网海中能有您这么一位古道热肠的能人义士,实在是我辈小白之幸事!!
非常感谢您了!


——至于在黑窗口中最后还是要显示“设备未就绪”已无伤大雅的了。并无移动USB硬盘,或许是笔记本电脑吧,抽时间在台式电脑上一试。




欢迎光临 批处理之家 (http://bbs.bathome.net/) Powered by Discuz! 7.2