找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
楼主: smatenchen

[文件操作] 求教批处理只保留指定文件夹和文件

[复制链接]
 楼主| 发表于 2021-5-23 21:01:06 | 显示全部楼层
回复 6# xp3000


您好!
pushd popd
这两个起什么作用?
多谢!
 楼主| 发表于 2021-5-23 21:05:15 | 显示全部楼层
回复 6# xp3000


您好!
exe$ ini$
这个是何意?

"^111 ^222"
这是何意?转义?
这是什么用法?
多谢!
 楼主| 发表于 2021-5-23 21:06:40 | 显示全部楼层
回复 6# xp3000


您好!
2>nul
这是什么用法?
多谢!
发表于 2021-5-23 21:29:21 | 显示全部楼层
回复 28# smatenchen
变量参数%%a增强
扩充到一个文件扩展名:%%~xa(.txt/.doc ...等)
发表于 2021-5-23 21:33:49 | 显示全部楼层
回复 30# smatenchen
在引号内需转义
发表于 2021-5-23 23:33:06 | 显示全部楼层
回复 14# qixiaobin0715


   对,^ $ 更严谨些
 楼主| 发表于 2022-8-14 18:16:20 | 显示全部楼层
回复 6# xp3000 Batcher qixiaobin0715

{
@cd /d  d:\1\


@echo off & setlocal EnableDelayedExpansion
for /f "tokens=*" %%i in ('dir /a:d /b *') do (echo 搜索目录"%%i"&echo.
    for /f "delims=" %%j in ('echo %%i^| findstr /i /v "^111 ^222"') do echo 删除非匹配目录"%%j"&echo.&rd "%%j" /s /q
        for /f "delims=" %%k in ('echo %%i^| findstr /i /r /x "^111.* ^222.*"') do (echo 符合要求,即将切换.......
    pushd %%k&echo 切换目录"%%k"
        for /f "delims=" %%l in ('dir /b/a-d/on *.*^| findstr /i /v "^333 ^444"^| findstr /i /v "exe$ ini$"') do (
            echo 搜索到非匹配文件,删除"%%l" & del /f /s /q "%%l"
            )
    popd&echo.退出目录"%%k"&echo.
    rd "%%k" 2>nul&echo 如果"%%k"为空文件夹将删除
        )
    )
)
pause
}


1,
非常感谢!


2,
以上你写的代码你自己是否测试过呢?


3,
套了这么多层循环,运行效率,速度,肯定不高,将会有一长串运行结果啊!


4,
其运行逻辑,并不够清晰,代码庞杂,纠错时费力。


5,
其运行时会一闪而过,代码里的提示词就显得是多余的了。


6,
与第5楼的代码,实在是没法相提并论。
{
@echo off
for /f "delims=" %%a in ('dir /b /ad ^|findstr /vb "111 222"') do rd %%a
for /f "delims=" %%b in ('dir /b /a-d ^|findstr /ev ".ini .exe .bat"^|findstr /bv "333 444"') do del %%b
pause
}


7,
简单非常重要啊!你把原本简单的搞到极度复杂了!唉!
 楼主| 发表于 2022-8-14 18:24:10 | 显示全部楼层
回复 12# newswan

1,
非常感谢!


2,
你写的代码,其中的<,>,应该是\<xyz,xyz\>。
发表于 2022-8-16 19:46:57 | 显示全部楼层
本帖最后由 hfxiang 于 2022-8-16 20:04 编辑

  1. @echo off
  2. @rem 只保留以 111 和 222 为开头的文件夹,以 333 和 444 为开头的文件,以及所有.ini 和.exe 文件。
  3. @setlocal enableDelayedExpansion

  4. for /f "delims==" %%a in ('set _retain_ 2^>nul') do set "%%a="
  5. set "_retain_Folder_111=True"
  6. set "_retain_Folder_222=True"
  7. set "_retain_File_333=True"
  8. set "_retain_File_444=True"
  9. set "_retain_File_.ini=True"
  10. set "_retain_File_.exe=True"

  11. for /r %%a in (.,*) do (
  12.         set "Dir_a=%%~aa"
  13.         set "Dir_x=%%~xa"
  14.         set "Dir_n=%%~na"
  15.         set "Dir_n=!Dir_n:~0,3!"
  16.         if /i not "[%cd%]"=="[%%~fa]" if /i not "[%~f0]"=="[%%~fa]" if defined Dir_a if "[!Dir_a:~0,1!]"=="[d]" (
  17.                 if not defined _retain_Folder_!Dir_n! rd /q/s "%%~fa"
  18.         ) else (
  19.                 set "_retain_File_T="
  20.                 if defined _retain_File_!Dir_n! set "_retain_File_T=True"
  21.                 if defined _retain_File_!Dir_x! set "_retain_File_T=True"
  22.                 if not defined _retain_File_T del/f/s/q "%%~fa"
  23.         )
  24. )

  25. endlocal
  26. echo;&pause
  27. exit /b

复制代码
发表于 2022-8-17 08:54:31 | 显示全部楼层
回复 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
复制代码
发表于 2022-8-17 09:11:08 | 显示全部楼层
回复 40# qixiaobin0715


学习了一下,虽然没做测试,感觉这些代码对文件夹的处置部分可行,对文件的处置部分有可能工作起来不太顺畅。
 楼主| 发表于 2022-8-18 11:27:59 | 显示全部楼层
回复 40# qixiaobin0715

回复 39# hfxiang

{
@echo off
setlocal enabledelayed
for %%i in (333 444 .ini .exe .bat) do set _%%i=true
for %%i in (111 222) do set #%%i=true
for /f "delims=" %%i in ('dir /b /ad') do (
    set str=%%i
    if not defined #!str:~,3! rd /q /s "%%i"
)
for /f "delims=" %%i in ('dir /b /a-d') do (
    set str=%%i
    if not defined _%%~xi (
        if not defined _!str:~,3! del "%%i"
    )
)
pause
}


1,
非常感谢!


2,
二位的的解题思路,挺广阔啊!


3,
你写的代码里,其中do set _%%i=true,do set #%%i=true里的,=true改成=0或1或false或aa或123,应该都是可以的吧?
发表于 2022-8-18 13:00:24 | 显示全部楼层
回复 42# smatenchen


用什么都一样,这个只是表示标识的存在与否,更直白地说是这个标识“有值”和“无值”的问题
 楼主| 发表于 2022-8-18 15:12:17 | 显示全部楼层
回复 43# hfxiang

1,
非常感谢!


2,
鄙人分析代码时,感觉=true只是起一个标记的意义。
现在,你把它证实了。


3,
说实在的,把解法代码写成这些做判断的代码会比写成用 | 连接的代码,其运行时会更有效率吗?
发表于 2022-8-18 15:33:34 | 显示全部楼层
回复 44# smatenchen


    本人认为更高效,但实际情况你可以用大量一点的数据来测试对,有时还是相信自己的测试比较好!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-19 20:53 , Processed in 0.011618 second(s), 6 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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