批处理脚本:搜索子文件夹,查找文件,删除所有其他文件

时间:2018-07-17 07:47:07

标签: file batch-file for-loop if-statement

一段时间以来,我一直在试图解决这个问题,并且一直在互联网上进行搜索,但我仍找不到正确的答案。 所以这是我的问题:

我想创建一个批处理文件,该文件将搜索某个目录的所有子文件夹,找到一个特定的文件,然后删除搜索文件所在文件夹中除该文件以外的所有文件。

到目前为止,我想到的是:

cmd /k for /f %%a IN ('dir /b /s Neuer') do if not [%%a] == [index.txt] del /q %%a

但是,这只会删除每个子文件夹中的每个文件-并不是我想要的。

有人可以帮忙吗?

2 个答案:

答案 0 :(得分:0)

    @echo off

    setlocal

    if "%~2" == "" (
      echo/Usage: %~nx0 ^<directory^> ^<file^>
      echo/
      echo/%~nx0 will search the given ^<directory^> and its subdirectories
      echo/looking for ^<file^>. If the ^<file^> is found, then all the other
      echo/files and subdirectories in the same directory as ^<file^> will be
      echo/deleted. If more than one ^<file^> is found then this action is
      echo/repeated for all matches. Wildcards are not accepted; ^<file^> can
      echo/be the name of either a file or a directory.
      exit /b
    )

    if not exist "%~1\" (
      echo/%nx0: "%~1" does not exist or is not a directory
      exit /b
    )

    set "TARGETNAME=%~2"

    for /r "%~1" %%t in (*) do call :checkFile "%%~t"
    for /r "%~1" %%t in (.) do call :checkDir "%%~t"

    exit /b

:checkFile

    if not "%~nx1" == "%TARGETNAME%" exit /b
    echo/* Found "%~1"
    echo/  - Deleting files in directory "%~dp1" . . .
    for %%f in ("%~dp1*") do call :delFile "%%f"
    echo/  - Deleting directories in directory "%~dp1" . . .
    for /d %%d in ("%~dp1*") do call :delDir "%%d"
    exit /b

:checkDir

    set "TESTNAME=%~1"
    call :checkFile "%TESTNAME:~0,-2%"
    exit /b

:delFile

    if "%~nx1" == "%TARGETNAME%" exit /b

    echo/    : del "%~1"
    rem        del "%~1"
    exit /b

:delDir

    if "%~nx1" == "%TARGETNAME%" exit /b

    echo/    : rd /q /s "%~1"
    rem        rd /q /s "%~1"
    exit /b

注意:

  1. 在生产中,当然可以进行一些错误检查。

    • 也许某些文件无法删除,因为它们具有只读属性,或者运行脚本的用户没有适当的特权,或者它们正在使用中,等等。

    • 出于某些类似原因,或者由于它们包含隐藏文件,或者因为它们包含无法删除的文件,可能无法删除某些目录。

  2. 脚本会查找具有给定名称的文件目录;很容易看出如何将搜索限制为仅文件。

  3. 该脚本将对与给定名称匹配的所有文件或目录执行其工作。

  4. 如此处所示,脚本实际上并没有删除任何内容,它只是打印将要删除的内容。要使其真正执行删除操作,只需删除remdel前面的rd

答案 1 :(得分:0)

正是出于这种问题,已经发明了命令forfiles

ForFiles explanation