返回列表 发帖

[文件操作] (已解决)检索某个根目录下的一级子目录和一级子文件,保留或删除。bat代码?

本帖最后由 ygqiang 于 2025-4-3 16:13 编辑

检索某个根目录下的一级子目录和一级子文件,符合要求就保留,否则就删除。bat代码?
只针对根目录下的一级子目录和一级子文件,检索、判断、操作(保留或删除)。


c盘根目录下,需要保留的一级子目录和一级子文件,名称如下:
---------------------------------------
一级子目录名称是
Intel
PerfLogs
Program Files
Program Files (x86)
Windows
Users
(下面是隐藏的子目录)
8888
Boot
Config.Msi
Documents and Settings
MSOCache
ProgramData
---------------------------------------


---------------------------------------
一级子文件名称是
kernel*.*
sealdr*.*
(下面是隐藏的文件)
ABSPE*.*
bootmgr*.*
BOOTSECT*.*

本帖最后由 ygqiang 于 2025-4-3 14:32 编辑
@echo off
setlocal enabledelayedexpansion
for /f "delims=:" %%i in ('findstr /n "^:del-dir$" "%~f0"') do (
    more +%%i "%~f0" > 保留子目录和子文件.txt
)
echo 循环读取txt文件的每一行,赋值给变量
set targe=''
for /f "delims=" %%i in (保留子目录和子文件.txt) do (
set target=%%i
echo !target!
pause >nul 2>nul
cls >nul 2>nul
)
pause >nul 2>nul
cls
exit
———————————————————————
:del-dir
Intel
PerfLogs
Program Files
Program Files (x86)
Windows
Users
8888
Boot
Config.Msi
Documents and Settings
MSOCache
ProgramData
kernel*.*
sealdr*.*
ABSPE*.*
bootmgr*.*
BOOTSECT*.*COPY

TOP

REM 遍历所有一级文件和目录
for /f "delims=" %%d in ('dir /b /ad "%root_dir%"') do (
    echo Checking directory: %%d
    if not "%%d"=="!target!" (
        echo directory: %%d
cls
        echo rmdir /s /q "%root_dir%\%%d"
pause
    )
)
for /f "delims=" %%f in ('dir /b /a-d "%root_dir%"') do (
    echo Checking file: %%f
    if not "%%f"=="!target!" (
        echo file: %%f
cls
        echo del /q "%root_dir%\%%f"
pause
    )
)COPY

TOP

本帖最后由 aloha20200628 于 2025-4-3 14:25 编辑

回复 1# ygqiang

本帖主要解决字符串中筛选指定关键词的问题...
以下是预览版,确认无误后可删除代码倒数第二行和第三行中的 echo, 变成实用版
@echo off &setlocal enabledelayedexpansion &cd /d "c:\"
for %%d in (
"Intel"
"PerfLogs"
"Program Files"
"Program Files (x86)"
"Windows"
"Users"
"8888"
"Boot"
"Config.Msi"
"Documents and Settings"
"MSOCache"
"ProgramData"
) do set d=!d! /c:"%%~d!"
for /f "delims=" %%d in ('dir/b/ad^|findstr /irv !d!') do echo,rd /q/s "%%d"
for /f "delims=" %%F in ('dir/b/a-d^|findstr /irv /c:"kernel.*" /c:"sealdr.*" /c:"ABSPE.*" /c:"bootmgr.*" /c:"BOOTSECT.*" ') do echo,del /q "%%F"
pause&exit/bCOPY

TOP

本帖最后由 ygqiang 于 2025-4-3 14:59 编辑

回复 4# aloha20200628


    谢谢,能否按照2楼代码,需要排除的
所有的一级子目录和一级子文件,
都存放在一个txt文件里?

然后判断,操作,都根据这个txt文件进行

rd和del可以放在一起操作文件名和文件吧?
rd 文件名称,del 文件名。
这2种情况,如果遇到了,实际也不会有什么副作用?

TOP

本帖最后由 aloha20200628 于 2025-4-3 16:45 编辑

回复 5# ygqiang

采用一楼用*通配符区分目录与文件的判据
以下代码是预览版,确认无误后可删除代码第4行和第5行中的 echo, 变成实用版
@echo off &setlocal enabledelayedexpansion &cd /d "c:\"
for /f "delims=:" %%n in ('findstr /bln ":::" "%~f0" ') do set "n=%%n"
for /f "usebackq skip=%n% tokens=1* delims=*" %%a in ("%~f0") do if "%%b"== "" (set d=!d! /c:"%%~a!") else (set F=!F! /c:"%%~a!")
for /f "delims=" %%d in ('dir/b/ad^|findstr /irv !d!') do echo,rd /q/s "%%d"
for /f "delims=" %%F in ('dir/b/a-d^|findstr /irv !F!') do echo,del /q "%%F"
pause&exit/b
:::
Intel
PerfLogs
Program Files
Program Files (x86)
Windows
Users
8888
Boot
Config.Msi
Documents and Settings
MSOCache
ProgramData
kernel*.*
sealdr*.*
ABSPE*.*
bootmgr*.*
BOOTSECT*.*COPY

TOP

回复 6# aloha20200628


    谢谢,可用

TOP

@echo off
set root_dir=c:\
set folderlist="Intel" "PerfLogs" "Program Files" "Program Files (x86)" "Windows" "Users" "8888" "Boot" "Config.Msi" "Documents and Settings" "MSOCache" "ProgramData"
set filelist="kernel*.*" "sealdr*.*" "ABSPE*.*" "bootmgr*.*" "BOOTSECT*.*"
for %%a in (%folderlist%) do (
set d"%%~a"=1
)
setlocal
pushd "%root_dir%"
for /f "delims=" %%i in ('2^>nul dir /b /a-d %filelist%') do (
set f"%%i"=1
)
for /f "delims=" %%d in ('dir /b /a') do (
if exist "%%d\" (
if not defined d"%%d" (
echo rd /s /q "%%d"
)
) else if not defined f"%%d" (
echo del /a /f "%%d"
)
)
popd
endlocal
pauseCOPY
bat小白,请多指教!谢谢!

TOP

本帖最后由 ygqiang 于 2025-4-3 16:56 编辑

回复 8# 77七


    谢谢。需要排除的一级子目录和一级子文件,列出来。
感觉可读性不如楼上的代码

TOP

本帖最后由 77七 于 2025-4-3 19:29 编辑

回复 9# ygqiang



如果要求不严谨,突出一个“能用就行“,楼主可试试以下代码 (删除操作需删除echo 及转义符^再执行)。
@echo off
set root_dir=c:
(for /f "delims=" %%a in ('dir /b /a "%root_dir%" ^| findstr /livbg:"%~f0"') do (
        echo rd /s /q "%root_dir%\%%a" ^|^| del /a /f "%root_dir%\%%a"
)) 2>nul
pause
exit
Intel
PerfLogs
Program Files
Program Files (x86)
Windows
Users
8888
Boot
Config.Msi
Documents and Settings
MSOCache
ProgramData
kernel
sealdr
ABSPE
bootmgr
BOOTSECTCOPY
bat小白,请多指教!谢谢!

TOP

回复 10# 77七


      谢谢。这个代码,哪些特殊情况下会遇到问题呢?

TOP

回复 11# ygqiang


   文件夹和文件横着写成了两行,竖着却只有一列,已经埋下了“祸根”,无法区分文件、文件夹,只有区分它们之后才可进行文件夹的完全匹配、文件的开头匹配,假如匹配末尾(保留*.txt,很常见),代码则完全不适用。
假如仍要写成竖列,比如写两列,以列区分 或者以行区分 或者添加辅助字符去区分,代码进一步复杂,属于多此一举,且真正降低了代码的可读性、可维护性。
bat小白,请多指教!谢谢!

TOP

回复 10# 77七


    这代码测试了,不好用

TOP

最终代码,测试通过。
@echo off & setlocal enabledelayedexpansion
echo 代码开始
echo 删除c盘根目录下的一级子目录和一级子文件
cd /d "c:\"
for /f "delims=:" %%n in ('findstr /bln ":::::::::::::::::::::::::::::::::" "%~f0" ') do set "n=%%n"
for /f "usebackq skip=%n% tokens=1* delims=*" %%a in ("%~f0") do if "%%b"== "" (set d=!d! /c:"%%~a!") else (set F=!F! /c:"%%~a!")
for /f "delims=" %%d in ('dir/b/ad^|findstr /irv !d!') do echo,rd /q/s "%%d"
for /f "delims=" %%F in ('dir/b/a-d^|findstr /irv !F!') do echo,del /q "%%F"
pause
for /f "delims=" %%d in ('dir/b/ad^|findstr /irv !d!') do rd /q/s "%%d"
for /f "delims=" %%F in ('dir/b/a-d^|findstr /irv !F!') do del /q "%%F"
pause&exit/b
:::::::::::::::::::::::::::::::::
echo,一级子目录
Intel
PerfLogs
Program Files
Program Files (x86)
Windows
Users
$RECYCLE.BIN
8888
Boot
Config.Msi
Documents and Settings
MSOCache
ProgramData
Recovery
System Volume Information
echo,一级子文件
kernel*.*
pagefile.sys
sealdr*.*
ABSPE*.*
bootmgr*.*
BOOTSECT*.*COPY

TOP

回复 14# ygqiang


  ”pagefile.sys“ 这个子文件包括在文件夹的排除列表中了,即变量 !d!,会导致误删,还需要更可靠的方法分辨文件夹和文件。
bat小白,请多指教!谢谢!

TOP

返回列表