删除目录中除 .bat 之外的所有文件

Delete all files in directory except .bat

我想删除 Windows 上的特定目录。我使用下面的代码。它工作正常。我想将我为此过程制作的 .bat 文件放在该目录中。当然,.bat 文件也被删除了。我希望将 .bat 文件从这次删除中排除。我应该如何处理代码?

Echo batch file delete folder
@RD /S /Q "D:\testfolder" 

有多种方法可以完成您的任务。

方法(特别是当你通常用一个命令删除目录,用另一个命令删除文件时),是分别识别文件和子目录。首先使用 RD 命令确定子目录并删除它们,然后删除除批处理文件本身之外的所有文件,%0:

您可以使用 ForFiles 实用程序在一行中完成此操作:

@%SystemRoot%\System32\forfiles.exe /P "%~dp0." /C "%SystemRoot%\System32\cmd.exe /C If @IsDir==TRUE (RD /S /Q @File) Else If /I Not @file == \"%~nx0\" Del /A /F @File"

或者您可以使用 For 循环,使用 Dir 命令:

@For /F Delims^=^ EOL^= %%G In ('Dir /B /A "%~dp0"') Do @If "%%~aG" GEq "d" (RD /S /Q "%%G") Else If /I Not "%%G" == "%~nx0" Del /A /F "%%G"

请注意,您只能 remove/delete 您拥有所需权限的项目

我会遍历要删除其内容的文件夹中的项目,一个接一个地删除,除了它的名称等于批处理文件的名称:

rem // Change into target directory:
pushd "%~dp0." && (
    rem /* Loop through immediate children of the target directory, regarding even
    rem    hidden and system items; to ignore such (replace `/A` by `/A:-H-S`): */
    for /F "delims= eol=|" %%I in ('dir /B /A "*"') do (
        rem // Check name of current item against name of this batch script:
        if /I not "%%~nxI"=="%~nx0" (
            rem /* Assume the current item is a sub-directory first (remove by `rd`);
            rem    when removal fails, try to delete it as a file (done by `del`): */
            rd /S /Q "%%I" 2> nul || del /A /F "%%I"
        )
    )
    rem // Return from target directory:
    popd
)

您所要做的就是通过打开一个虚拟读取句柄来锁定您的批处理文件。

echo The batch file wont be deleted because it is locked by a dummy input redirection.
rd /s /q "D:\testfolder" 9<"%~f0"

当然,rd命令会显示一条错误信息,因为目标目录中至少有一个文件(您自己的批处理文件)无法删除。您可以通过将标准错误流重定向到 nul 设备来隐藏该消息:

rd /s /q "D:\testfolder" 9<"%~f0" 2>nul