使用批处理脚本删除子子文件夹中的某些文件

时间:2014-08-26 08:39:26

标签: windows file batch-file delete-file

我需要一个批处理脚本,删除除两个文件之外的给定文件夹的子子文件夹中的所有文件。 我有一组子文件夹的名称,可以找到文件set sf=(sf0 sf1) 这些子文件夹嵌套在给定路径下的某处,例如

<givenPath>\something\anything\sf0
<givenPath>\whatever\sf1

在这些子文件夹中,我现在要删除除2之外的所有文件。

<givenPath>中的所有其他文件和子文件夹必须保持不变。

我发现这可以通过以下方式实现:

for /R "%somePath%" %%D in (*.*) do (
    if /I not "%%D"=="dontDelete.file" (
        if /I not "%%D"=="hasToStay.file" (
             echo del /S /Q "%somePath%\%%D"
        )
    )
)

我的问题是让%some_path%指向正确的子文件夹,如上所述。

如何实现这一目标? 或者我完全错了,还有更好的方法吗?

2 个答案:

答案 0 :(得分:0)

您可以递归搜索文件名并删除文件。

我没有删除子目录,因为如果你想保留目录,你的问题就不清楚了。

所有目录中的所有文件,除了两个文件&#34; file1&#34;和&#34; file2&#34;将被删除,目录将保留。如果要删除目录,请删除保留目录的第一个if循环。

批次文件:

@echo off

rem set your two file names in these variables
set file1="a.txt"
set file2="b.txt"

for /f "delims=" %%a in ('dir /s /b *.*') do (
    if exist %%~sa\NUL (
            echo It is a directory, not deleted: %%~sa
        ) else if "%%~nxa" == %file1% (
            echo Not deleted : %file1%
        ) else if "%%~nxa" == %file2% (
            echo Not deleted : %file2%
        ) else (
            del /s /q "%%a"
        )
)

答案 1 :(得分:0)

这将分两步完成工作

首先,生成完整的文件夹列表(在给定路径下)。此文件夹列表已过滤,不包含&#34;特殊&#34;文件夹。对于其余文件夹,将删除所有文件。

接下来,枚举所有剩余的文件(这是第一步的原因,如果没有必要不处理文件,只是文件夹,所以第二个列表更短)。此列表经过筛选,以排除任何&#34;特殊&#34;文件在&#34;特殊&#34;文件夹。其余文件将被删除。

@echo off
    setlocal enableextensions disabledelayedexpansion

    rem configure starting path
    set "givenPath=%cd%"

    rem list of folders that need a special test
    set "specialFolders="sf0" "sf1""

    rem list of files to keep inside special folders
    set "specialFiles="dontDelete.file" "hasToStay.file""

    rem a temporary file will be needed
    set "tempFile=%temp%\%~nx0.%random%.tmp"

    rem STEP 1 - remove all files from non special folders

        rem prepare temporary file to filter the list of folders
        (for %%a in (%specialFolders%) do echo \%%~a) > "%tempFile%"

        rem remove all files from not special folders
        for /f "delims=" %%a in ('
            dir /ad /s /b "%givenPath%" ^| findstr /i /v /e /l /g:"%tempFile%"
        ') do echo del /f /q "%%~fa\*"

    rem STEP 2 - Delete all non special files from special folders

        rem generate a temporay file to filter the list of files
        (for %%a in (%specialFolders%) do for %%b in (%specialFiles%) do echo \%%~a\%%~b) > "%tempFile%"

        rem remove any file not matching the special folder/files
        for /f "delims=" %%a in ('
            dir /a-d /s /b "%givenPath%" ^| findstr /i /v /e /l /g:"%tempFile%"
        ') do echo del /f /q "%%~fa"

    rem remove temporary file
    del /q "%tempFile%" >nul 

可以删除第一步,结果将是相同的,但不是对非特殊文件夹执行一个del操作,每个文件都会有del个操作他们内心。

删除操作仅回显给控制台。如果输出正确,请删除echo命令前缀的del

echo测试命令使第二步找到第一步中尚未删除的所有文件(echo)。如果没有删除第一步中的echo,第二步就会更快,因为它必须处理更少的文件。

已编辑以适应评论 - 因为只应删除特殊文件夹中的非特殊文件

@echo off
    setlocal enableextensions disabledelayedexpansion

    rem configure starting path
    set "givenPath=%cd%"

    rem list of folders that need a special test
    set "specialFolders="sf0" "sf1""

    rem list of files to keep inside special folders
    set "specialFiles="dontDelete.file" "hasToStay.file""

    rem temporary files will be needed
    set "folderFilter=%temp%\%~nx0.%random%.1.tmp"
    set "fileFilter=%temp%\%~nx0.%random%.2.tmp"

    rem prepare temporary file to filter the list of folders
    (for %%a in (%specialFolders%) do echo \\%%~a\\[^^\\]*) > "%folderFilter%"

    rem prepare temporary file to filter the list of files
    (for %%a in (%specialFiles%) do echo \%%~a) > "%fileFilter%"

    rem Search all files, filter and delete
    for /f "delims=" %%a in ('
        dir /s /b /a-d "%givenPath%" 
        ^| findstr /i /e /r /g:"%folderFilter%"
        ^| findstr /i /e /l /v /g:"%fileFilter%"
    ') do echo del /f /q "%%~fa"

    rem remove temporary files
    del /q "%folderFilter%" > nul 
    del /q "%fileFilter%"   > nul

检索完整的文件列表(dir /s),从中删除任何不在特殊文件夹(findstr with folderFilter)内的内容,并从剩余的文件列表中删除特殊文件({{ 1}} with fileFilter)。列表中的任何内容都将被删除

与前面的代码一样,findstr操作仅回显到控制台。如果输出正确,请删除del以删除文件。

相关问题