[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖
你提的条件太多了,一次性解决不是不行,还不如分开实现。一次性解决可用:
  1. for /f ... ('dir /b') do (
  2. 这里用if进行判断
  3. ...
  4. )
  5. pause
复制代码

TOP

本帖最后由 qixiaobin0715 于 2021-5-23 08:48 编辑

回复 1# smatenchen
文件和文件夹分别处理,未测试,del/rd慎用:
  1. @echo off
  2. for /f "delims=" %%a in ('dir /b /ad ^|findstr /vb "111 222"') do rd %%a
  3. for /f "delims=" %%b in ('dir /b /a-d ^|findstr /ev ".ini .exe .bat"^|findstr /bv "333 444"') do del %%b
  4. pause
复制代码

TOP

回复 12# newswan
表达单词的起始位置和结束位置,少了一个反斜杠。
还是用^和$要严谨些,如果文件名是“abc 333.txt” 哪?

TOP

回复 8# smatenchen
具体可以看看http://bbs.bathome.net/thread-14682-1-1.html

TOP

本帖最后由 qixiaobin0715 于 2021-5-23 10:09 编辑

回复 16# smatenchen
在代码上面已经做过说明了,未经测试。已修改,未测试。

TOP

本帖最后由 qixiaobin0715 于 2021-5-23 10:08 编辑

findstr看不明白,用if吧,这样应当看得懂吧,未测试:
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. for /f "delims=" %%a in ('dir /b') do (
  4.     set "str=%%a"
  5.     set "str1=!str:~,3!"
  6.     set "str2=!str:~-3!"
  7.     if "%%~xa"=="" (
  8.         if not !str1!==111 (
  9.             if not !str1!==222 rd "%%a"
  10.         )
  11.     )
  12.     if not "%%~xa"=="" (
  13.         if not !str2!==ini (
  14.             if not !str2!==exe (
  15.                 if not !str2!==bat (
  16.                     if not !str1!==333 (
  17.                         if not !str1!==444 del %%a
  18.                     )
  19.                 )
  20.             )
  21.         )
  22.     )
  23. )
  24. pause
复制代码

TOP

回复 28# smatenchen
变量参数%%a增强
扩充到一个文件扩展名:%%~xa(.txt/.doc ...等)

TOP

回复 30# smatenchen
在引号内需转义

TOP

回复 37# smatenchen
有时 简洁≠效率高。
5楼代码在循环体中使用了管道命令,效率就会降低。从楼上代码中受到启示,弃用管道命令,全部使用判断语句,这样效率可能要高一些:
  1. @echo off
  2. setlocal enabledelayed
  3. for %%i in (333 444 .ini .exe .bat) do set _%%i=true
  4. for %%i in (111 222) do set #%%i=true
  5. for /f "delims=" %%i in ('dir /b /ad') do (
  6.     set str=%%i
  7.     if not defined #!str:~,3! rd /q /s "%%i"
  8. )
  9. for /f "delims=" %%i in ('dir /b /a-d') do (
  10.     set str=%%i
  11.     if not defined _%%~xi (
  12.         if not defined _!str:~,3! del "%%i"
  13.     )
  14. )
  15. pause
复制代码

TOP

效率是个复杂的问题:
1.单独使用管道、单独使用命令及单独使用for循环,在效率上都没有问题,组合起来就有可能影响效率;
2.实际上40楼后2个for循环与命令dir连用也会影响效率;
40楼代码可以这样改写:
  1. @echo off
  2. setlocal enabledelayed
  3. for %%i in (333 444 .ini .exe .bat) do set _%%i=true
  4. for %%i in (111 222) do set #%%i=true
  5. for /d %%i in (*) do (
  6.     set str=%%i
  7.     if not defined #!str:~,3! rd /q /s "%%i"
  8. )
  9. for %%i in (*) do (
  10.     set str=%%i
  11.     if not defined _%%~xi (
  12.         if not defined _!str:~,3! del "%%i"
  13.     )
  14. )
  15. pause
复制代码

TOP

本帖最后由 qixiaobin0715 于 2022-8-19 15:34 编辑

for /r %%a in (.,*) do(还是那句话,试试即知)
不必研究这个了。我认为是为了在一个for循环里同时得到当前文件夹下的所有文件及文件夹(包括子文件夹和其中的文件),这种用法是有缺陷的,后续处理麻烦。推荐使用:
  1. for /f "delims=" %%a in ('dir /b /s') do ...
复制代码

TOP

返回列表