删除目录中除 .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
我想删除 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