无忧启动论坛

 找回密码
 注册
搜索
系统gho:最纯净好用系统下载站投放广告、加入VIP会员,请联系 微信:wuyouceo
查看: 3279|回复: 27
打印 上一主题 下一主题

[发布] 合并两条命令

[复制链接]
跳转到指定楼层
1#
发表于 2023-12-10 20:39: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")


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

2#
发表于 2023-12-10 20:54:58 来自手机 | 只看该作者
可以练习forfiles
回复

使用道具 举报

3#
发表于 2023-12-10 21:12:42 | 只看该作者
现在多利用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
复制代码


这段代码做了以下操作:
  • @echo off 禁用了命令的回显,使得批处理文件的输出更加清晰。
  • setlocal enabledelayedexpansion 启用了命令脚本中的延迟扩展功能,这使得我们能够在循环中正确地处理变量。
  • 第一个 for 循环遍历所有的文件夹,如果文件夹的名称中包含 "ar-SA",则将其删除。/d 选项让 for 命令处理文件夹,/r 选项让它在子文件夹中递归查找。if 条件判断语句检查文件夹的名称是否包含 "ar-SA",如果包含则执行删除操作。rd /s /q 命令用于删除文件夹及其所有内容,/s 选项表示包括子文件夹和文件,/q 选项表示在删除时不询问确认。
  • 第二个 for 循环遍历所有的文件,如果文件的名称中包含 "ar-SA",则将其删除。del /q 命令用于删除文件,/q 选项表示在删除时不询问确认。
  • echo Done. 和 pause 命令分别用于在脚本执行完成后显示消息并暂停,以便用户能看到批处理脚本已执行完毕。


这是文心一言的回答。
回复

使用道具 举报

4#
发表于 2023-12-11 08:35:54 | 只看该作者
学习了
回复

使用道具 举报

5#
发表于 2023-12-11 08:50:54 | 只看该作者
学习代码

回复

使用道具 举报

6#
发表于 2023-12-11 09:31:41 | 只看该作者
谢谢分享!
回复

使用道具 举报

7#
发表于 2023-12-11 09:53: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得出这个..
回复

使用道具 举报

8#
 楼主| 发表于 2023-12-11 12:17:46 | 只看该作者
本帖最后由 shuini 于 2023-12-11 12:23 编辑

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

使用道具 举报

9#
发表于 2023-12-11 12:26:53 | 只看该作者
进来学习
回复

使用道具 举报

10#
发表于 2023-12-11 13:43:09 | 只看该作者
你两次查找的路径都不一样,怎么提高效率
回复

使用道具 举报

11#
发表于 2023-12-11 14:23:33 | 只看该作者
感谢分享
回复

使用道具 举报

12#
发表于 2023-12-11 15:53:13 | 只看该作者
本帖最后由 newyun 于 2023-12-11 16:15 编辑

不好搞,我试了用&&也不行
回复

使用道具 举报

13#
发表于 2023-12-11 18:04:32 | 只看该作者
本帖最后由 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")
回复

使用道具 举报

14#
 楼主| 发表于 2023-12-12 08:26:13 | 只看该作者
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~”。。。即一看那名称就是特指的语言名称,而非简单以通配符匹配的组合。
回复

使用道具 举报

15#
发表于 2023-12-12 10:00:44 | 只看该作者
本帖最后由 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]"
回复

使用道具 举报

16#
发表于 2023-12-12 10:13:51 | 只看该作者
shuini 发表于 2023-12-12 08:26
漏处理了有空格的名称,错处理了*ar-SA*。
比如处理“ar-SA”,也处理“ar-SA *”,但不处理如类似“Alt ...

哦。还有名字带空格问题,for的参数加上"delims="即可。
for /f "delims="
回复

使用道具 举报

17#
发表于 2023-12-12 10:36:28 | 只看该作者
学习一下
回复

使用道具 举报

18#
 楼主| 发表于 2023-12-12 12:14:08 | 只看该作者
本帖最后由 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, 下载次数: 44)

1.png
回复

使用道具 举报

19#
发表于 2023-12-12 15:26:15 | 只看该作者
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
回复

使用道具 举报

20#
发表于 2023-12-12 16:30:54 | 只看该作者
forfiles 直接,简单
回复

使用道具 举报

21#
 楼主| 发表于 2023-12-12 18:07:03 | 只看该作者
本帖最后由 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结尾的名称也无法匹配正则表达式的后半部分。

回复

使用道具 举报

22#
 楼主| 发表于 2023-12-12 20:05:23 | 只看该作者
kingshui 发表于 2023-12-12 16:30
forfiles 直接,简单

同样也会有字符匹配问题
回复

使用道具 举报

23#
发表于 2023-12-13 09:40:10 | 只看该作者
shuini 发表于 2023-12-12 18:07
做了些修改,目前就剩完整名称为ar-SA的文件夹漏删,无关权限,因为这个是纯粹测试用的目录。
for /f "d ...

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

回复

使用道具 举报

24#
发表于 2023-12-13 13:43:44 | 只看该作者
学习学习。
回复

使用道具 举报

25#
发表于 2023-12-13 19:14:20 | 只看该作者
对我来说,很深奥
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|捐助支持|无忧启动 ( 闽ICP备05002490号-1 )

闽公网安备 35020302032614号

GMT+8, 2024-11-23 08:53

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表