0

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

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

3 回答 3

1

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

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 
于 2021-03-14T17:07:21.533 回答
0

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

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
)
于 2021-03-14T14:31:52.660 回答
0

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

该方法(尤其是当您通常使用一个命令删除目录并使用另一个命令删除文件时)是分别标识文件和子目录。首先使用命令识别子目录并删除它们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"

请注意,您只能移除/删除您拥有所需权限的项目

于 2021-03-14T11:57:44.660 回答