无忧启动论坛

标题: 合并两条命令 [打印本页]

作者: shuini    时间: 2023-12-10 20:39
标题: 合并两条命令
本帖最后由 shuini 于 2023-12-11 14:19 编辑

第一段是遍历查找包含*ar-SA*名称的文件夹并删除:
for /d /r C:\ %%i in (*ar-SA*) do (rd /s /q "%%i")
第二段是遍历查找包含*ar-SA*名称的文件并删除:

for /r C:\ %%i in (*ar-SA*) do (del /f /q "%%i")


这样需要两次查找,效率不高,该怎样合并这两条命令?


作者: szwp    时间: 2023-12-10 20:54
可以练习forfiles
作者: 心零    时间: 2023-12-10 21:12
现在多利用AI做题,不一定好用,起码可以参考。
  1. @echo off  
  2. setlocal enabledelayedexpansion  
  3.   
  4. :: 第一段:遍历查找包含 "ar-SA" 名称的文件夹并删除  
  5. for /d /r %%d in (*) do (  
  6.     if not "%%d"=="" (  
  7.         set "folder=%%d"  
  8.         if /i "!folder:ar-SA=!" neq "!folder!" (  
  9.             echo Deleting folder: "!folder!"  
  10.             rd /s /q "!folder!"  
  11.         )  
  12.     )  
  13. )  
  14.   
  15. :: 第二段:遍历查找包含 "ar-SA" 名称的文件并删除  
  16. for /r %%f in (*) do (  
  17.     if not "%%f"=="" (  
  18.         set "file=%%f"  
  19.         if /i "!file:ar-SA=!" neq "!file!" (  
  20.             echo Deleting file: "!file!"  
  21.             del /q "!file!"  
  22.         )  
  23.     )  
  24. )  
  25.   
  26. echo Done.  
  27. pause
复制代码


这段代码做了以下操作:


这是文心一言的回答。

作者: zpwz    时间: 2023-12-11 08:35
学习了
作者: tanglf    时间: 2023-12-11 08:50
学习代码


作者: 北方醋    时间: 2023-12-11 09:31
谢谢分享!
作者: holley2008    时间: 2023-12-11 09:53
  1. @echo off
  2. for /r %%i in (*ar-SA*) do (
  3.     if exist "%%i" (
  4.         if "%%~ai"=="d" (
  5.             rd /s /q "%%i"
  6.         ) else (
  7.             del /f /q "%%i"
  8.         )
  9.     )
  10. )
复制代码


我用AI得出这个..
作者: shuini    时间: 2023-12-11 12:17
本帖最后由 shuini 于 2023-12-11 12:23 编辑
holley2008 发表于 2023-12-11 09:53
我用AI得出这个..

之前也是用ai合并的,但这只能删文件不能删文件夹。

作者: yyz2191958    时间: 2023-12-11 12:26
进来学习
作者: newyun    时间: 2023-12-11 13:43
你两次查找的路径都不一样,怎么提高效率
作者: kevin2023    时间: 2023-12-11 14:23
感谢分享
作者: newyun    时间: 2023-12-11 15:53
本帖最后由 newyun 于 2023-12-11 16:15 编辑

不好搞,我试了用&&也不行
作者: ppll2030    时间: 2023-12-11 18:04
本帖最后由 ppll2030 于 2023-12-11 18:06 编辑

for /f  %%i in ('dir /b /s "c:\" ^| findstr /ilc:"ar-SA"') do (if exist "%%i\" (rd /q /s "%%i") else del /q /s "%%i")
作者: shuini    时间: 2023-12-12 08:26
ppll2030 发表于 2023-12-11 18:04
for /f  %%i in ('dir /b /s "c:\" ^| findstr /ilc:"ar-SA"') do (if exist "%%i\" (rd /q /s "%%i") else ...

漏处理了有空格的名称,错处理了*ar-SA*。
比如处理“ar-SA”,也处理“ar-SA *”,但不处理如类似“Altar-SA”或“ar-SATA”结构的名称。
简单点说就是只处理单纯的“ar-SA”或“-ar-SA-”或“_ar-SA_”或“~ar-SA~”或“-ar-SA~”。。。即一看那名称就是特指的语言名称,而非简单以通配符匹配的组合。
作者: ppll2030    时间: 2023-12-12 10:00
本帖最后由 ppll2030 于 2023-12-12 10:14 编辑
shuini 发表于 2023-12-12 08:26
漏处理了有空格的名称,错处理了*ar-SA*。
比如处理“ar-SA”,也处理“ar-SA *”,但不处理如类似“Alt ...

特殊的搜索字符用正则表达式即可,把findstr的参数和搜索字符改为以下内容试试:
findstr /r "[-_~]*[^a-z0-9]ar-SA[-_~]*[^a-z0-9]"
作者: ppll2030    时间: 2023-12-12 10:13
shuini 发表于 2023-12-12 08:26
漏处理了有空格的名称,错处理了*ar-SA*。
比如处理“ar-SA”,也处理“ar-SA *”,但不处理如类似“Alt ...

哦。还有名字带空格问题,for的参数加上"delims="即可。
for /f "delims="
作者: endy329    时间: 2023-12-12 10:36
学习一下
作者: shuini    时间: 2023-12-12 12:14
本帖最后由 shuini 于 2023-12-12 12:15 编辑
ppll2030 发表于 2023-12-12 10:13
哦。还有名字带空格问题,for的参数加上"delims="即可。
for /f "delims="

代码修改为
for /f "delims=" %%i in ('dir /b /s "c:\" ^| findstr /r "[-_~]*[^a-z0-9]is-IS[-_~]*[^a-z0-9]"') do (if exist "%%i\" (rd /q /s "%%i") else del /q /s "%%i")
直观点上一张包含“is-IS”名称的文件图。最新的处理结果是只删除了is-IS文件夹里的文件,is-IS文件夹却保留了。

其他类似$$_azurearcsetup_arcsetup_is-is_d88b442544315392.cdf-ms的文件没有删除,当然像wow64_microsoft-windows-iis-isapifilter_31bf3856ad364e35_10.0.20348.825_none_469c74f7c71a54c6.manifest这类文件本就不该删除。

1.png (19.6 KB, 下载次数: 47)

1.png

作者: ppll2030    时间: 2023-12-12 15:26
shuini 发表于 2023-12-12 12:14
代码修改为
for /f "delims=" %%i in ('dir /b /s "c:\" ^| findstr /r "[-_~]*[^a-z0-9]is-IS[-_~]*[^a ...

文件夹无法删除,请自行查看是否被其他程序占用或权限问题。
findstr的参数多加一个i,即搜索不区分大小写。如:findstr /ri
作者: kingshui    时间: 2023-12-12 16:30
forfiles 直接,简单
作者: shuini    时间: 2023-12-12 18:07
本帖最后由 shuini 于 2023-12-12 19:38 编辑
ppll2030 发表于 2023-12-12 15:26
文件夹无法删除,请自行查看是否被其他程序占用或权限问题。
findstr的参数多加一个i,即搜索不区分大小 ...

做了些修改,目前就剩完整名称为ar-SA的文件夹漏删,无关权限,因为这个是纯粹测试用的目录。
for /f "delims=" %%i in ('dir /b /s "c:\0000" ^| findstr /R /I ".*[-_~]ar-SA[-_~].*"') do (if exist "%%i\" (rd /q /s "%%i") else del /q /s "%%i")
-----------------------
以上代码问题在于以ar-SA开头的名称无法匹配正则表达式的前半部分,以ar-SA结尾的名称也无法匹配正则表达式的后半部分。


作者: shuini    时间: 2023-12-12 20:05
kingshui 发表于 2023-12-12 16:30
forfiles 直接,简单

同样也会有字符匹配问题
作者: ppll2030    时间: 2023-12-13 09:40
shuini 发表于 2023-12-12 18:07
做了些修改,目前就剩完整名称为ar-SA的文件夹漏删,无关权限,因为这个是纯粹测试用的目录。
for /f "d ...

用echo显示查找结果,检查是否字符串表达问题。
表达式涵盖不全的,可以考虑用多字符串并用,中间用空格分开即可。


作者: willishe    时间: 2023-12-13 13:43
学习学习。
作者: yyz2191958    时间: 2023-12-13 19:14
对我来说,很深奥




欢迎光临 无忧启动论坛 (http://bbs.c3.wuyou.net/) Powered by Discuz! X3.3