无忧启动论坛

 找回密码
 注册
搜索

合并两条命令

查看数: 3319 | 评论数: 24 | 收藏 1
关灯 | 提示:支持键盘翻页<-左 右->
    组图打开中,请稍候......
发布时间: 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*名称的文件并删除: ...

回复

yyz2191958 发表于 2023-12-13 19:14:20
对我来说,很深奥
willishe 发表于 2023-12-13 13:43:44
学习学习。
ppll2030 发表于 2023-12-13 09:40:10
shuini 发表于 2023-12-12 18:07
做了些修改,目前就剩完整名称为ar-SA的文件夹漏删,无关权限,因为这个是纯粹测试用的目录。
for /f "d ...

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

shuini 发表于 2023-12-12 20:05:23
kingshui 发表于 2023-12-12 16:30
forfiles 直接,简单

同样也会有字符匹配问题
shuini 发表于 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结尾的名称也无法匹配正则表达式的后半部分。

kingshui 发表于 2023-12-12 16:30:54
forfiles 直接,简单
ppll2030 发表于 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
endy329 发表于 2023-12-12 10:36:28
学习一下
ppll2030 发表于 2023-12-12 10:13:51
shuini 发表于 2023-12-12 08:26
漏处理了有空格的名称,错处理了*ar-SA*。
比如处理“ar-SA”,也处理“ar-SA *”,但不处理如类似“Alt ...

哦。还有名字带空格问题,for的参数加上"delims="即可。
for /f "delims="
ppll2030 发表于 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]"
shuini 发表于 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~”。。。即一看那名称就是特指的语言名称,而非简单以通配符匹配的组合。
ppll2030 发表于 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")
newyun 发表于 2023-12-11 15:53:13
本帖最后由 newyun 于 2023-12-11 16:15 编辑

不好搞,我试了用&&也不行
kevin2023 发表于 2023-12-11 14:23:33
感谢分享
newyun 发表于 2023-12-11 13:43:09
你两次查找的路径都不一样,怎么提高效率
yyz2191958 发表于 2023-12-11 12:26:53
进来学习
shuini 发表于 2023-12-11 12:17:46
本帖最后由 shuini 于 2023-12-11 12:23 编辑

之前也是用ai合并的,但这只能删文件不能删文件夹。
holley2008 发表于 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得出这个..
北方醋 发表于 2023-12-11 09:31:41
谢谢分享!
tanglf 发表于 2023-12-11 08:50:54
学习代码

zpwz 发表于 2023-12-11 08:35:54
学习了
心零 发表于 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 命令分别用于在脚本执行完成后显示消息并暂停,以便用户能看到批处理脚本已执行完毕。


这是文心一言的回答。
szwp 发表于 2023-12-10 20:54:58
可以练习forfiles

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

闽公网安备 35020302032614号

GMT+8, 2024-11-28 14:22

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

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