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

Windows 删除目录中除.bat以外的所有文件,windows,batch-file,directory,rmdir,delete-directory,Windows,Batch File,Directory,Rmdir,Delete Directory,我想删除Windows上的特定目录。我使用下面的代码。它很好用。我想把我为这个进程创建的.bat文件放在那个目录中。当然,.bat文件也会被删除。我想从这次删除中排除.bat文件。我应该如何处理代码 Echo batch file delete folder @RD /S /Q "D:\testfolder" 有几种方法可以完成你的任务 方法(特别是当您通常使用一个命令删除目录,使用另一个命令删除文件时)是分别标识文件和子目录。首先使用RD命令标识子目录并删除这些子目录,

我想删除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如果@IsDir==TRUE(RD/S/Q@File),否则如果/I不是@File==\“%~nx0\”Del/A/F@File”
或者您可以使用
For
循环,使用
Dir
命令:

@For/F Delims^=^EOL^=%%G In('Dir/B/A“%~dp0”)执行@If“%%~aG”GEq“d”(RD/S/Q“%%G”)否则如果/I不是“%%G”==“%%~nx0”Del/A/F“%%G”

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

我将遍历文件夹中您要删除其内容的项目,逐个删除,但其名称等于批处理文件的名称除外:

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"

如果目录包含文件(即批处理文件),则无法删除该目录。除非你只删除文件而不删除目录,否则这是不可能的。谢谢,但我不明白你的意思。我要删除的目录包含这些文件和我的*.bat文件。当我用上面的代码运行*.bat文件时,它工作得非常好。但是,我不希望删除*.bat文件。因此,您希望将冰箱扔掉,因为不再需要它,但您希望冰箱中有啤酒,但您希望将其保存在冰箱中。有可能把冰箱扔掉而不把啤酒扔掉吗?所以这里只有三种方法。要么删除文件夹中的所有内容,如果希望批处理文件存在于文件夹中,则保留批处理文件和文件夹本身,要么在删除时将批处理文件从目录中复制出来,否则最好的情况是从一开始就不要将批处理文件存储在文件夹中。我不想扔掉冰箱。除了冰箱里的水,我想把所有的食物和饮料都扔掉。在我已经给出的代码中,冰箱并没有被抛出。它只是清空了它的内部。我想要的不应该那么难。请原谅我的无知。我尝试了上面的文件实用程序,它工作得很完美。这就是我想要的。ThanksI建议您使用我发布的两种方法中更快的,
For/F
loop方法。BTW @ VulaDelmir,请阅读并考虑基于内容的动作。此方法不会删除名称包含非英语拉丁字母的文件。只包含英文拉丁字母的单词可以。@Vuslatdemir,请提供一个或多个示例供我确认。另外,请让我们知道您当前的代码页是什么,即打开命令提示窗口,键入
chcp
,然后按
[ENTER]
键。您还可以考虑将首选方案标记为“接受”。例如,如果文件名为ASK.TXT,则没有问题。但是如果它的名字是aşk.txt,命令行会说“找不到C:\aşk.txt”。Ş是一些突厥语的字母。但我意识到这个问题只出现在几封信里。例如,日语和俄语字母表没有问题。当我输入chcp时,它会显示“活动代码页:437”。Forfiles实用程序没有问题。很好,很好。但是@Compo共享的下面的代码要短得多,所以我选择了它。非常感谢。短代码是:
@%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”
@Vuslatdemir它之所以更长,基本上是因为代码中的所有注释。起初我也在想类似的事情,但我拒绝了这个想法,因为我不确定
rd
是否仍在继续删除;不过,经过几次测试后,我认为这会很好地工作…
rd /s /q "D:\testfolder" 9<"%~f0" 2>nul