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

Posted

技术标签:

【中文标题】删除目录中除 .bat 以外的所有文件【英文标题】:Delete all files in directory except .bat 【发布时间】:2021-06-11 21:10:13 【问题描述】:

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

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

【问题讨论】:

如果目录包含文件,即您的批处理文件,则不能删除该目录。除非你只删除文件而不是目录,否则这是不可能的。 谢谢,但我没听懂。我要删除的目录有文件和我的 *.bat 文件。当我使用上述代码运行 *.bat 文件时,它运行良好。但是,我希望不删除 *.bat 文件。 所以你想把你的冰箱扔掉,因为它不再需要了,但是你想把冰箱里的啤酒放在冰箱里,但你想把它放在冰箱里。有没有可能把冰箱扔掉而不把啤酒连同它一起扔掉? 所以这里只有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 

【讨论】:

一开始我也在考虑这样的事情,但是我打消了这个想法,因为我不确定rd是否还在继续删除;然而,经过几次测试,我认为这会很好地工作......【参考方案2】:

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

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

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

【讨论】:

我试过上面的 ForFiles 实用程序,效果很好。这就是我想要的。谢谢 我建议您使用我发布的两种方法中更快的For /F 循环方法。顺便说一句@Vuslatdemir,请阅读What should I do when someone answers my question?,并根据其内容考虑采取行动。 'For \f' 循环方法有问题。此方法不会删除名称包含非英语拉丁字母的文件。只包含英文拉丁字母的单词是可以的。 @Vuslatdemir,请提供一个或多个示例供我确认。另外请告诉我们您当前的代码页是什么,即打开您的命令提示符窗口,输入chcp,然后按[ENTER] 键。 您能否考虑将您的首选解决方案标记为已接受 比如文件名是ask.txt,没问题。但是如果它的名字是 aşk.txt 命令行会说“Could not Find C:\aşk.txt”。 Ş 是一些突厥语系的字母。但我意识到这个问题只是几个字母。例如,日文和俄文字母没有问题。此外,当我键入 chcp 时,它会显示“活动代码页:437”。 Forfiles utiliy 没有问题。它工作正常。【参考方案3】:

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

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
)

【讨论】:

它工作正常。但是@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 它更长,基本上是因为代码中的所有 cmets。

以上是关于删除目录中除 .bat 以外的所有文件的主要内容,如果未能解决你的问题,请参考以下文章

用于删除目录中除指定列表之外的所有文件夹的批处理文件

如何删除数组索引中除第0条以外的所有记录?

BAT 删除隐藏文件

bat命求助,如何删除文件夹和子文件夹中某个类型以外的所有文件。

怎样用bat删除制定的文件/文件夹?

bat删除指定目录下的所有文件(包括文件夹)、