如何在Windows上删除大量文件


22

我有一个包含数百万个子目录和数万亿个文件的目录。现在我必须清除它。说一万亿,我不是在谈论文件的大小,而是文件的数量。

我尝试使用del/s和使用Windows资源管理器将其删除。两者都无法完成任务。我试图一一删除一些子目录,这花了我几天的时间。我遇到的问题是,无论使用del或使用Explorer,每次都可以在任务管理器中看到资源管理器实例消耗大量内存,并逐渐使系统崩溃。

仍有几亿个文件要删除。一个(或几个)命令/动作有可能实现吗?


[编辑]

我尝试使用Cygwin进行操作rm -fr,并产生了相同的结果。概括为:

  1. 无论使用Windows资源管理器,DEL从命令提示符还是Cygwin rm命令,系统内存都会逐渐降至零,并且该框最终会崩溃。

  2. 如果在系统故障之前的任何时候关闭了该进程(通过CTRL + C或其他方法),则该框将继续正常运行。但是,将不会释放所有使用的内存。说,我已经停止了该过程,而系统内存达到了91%,任务管理器告诉您:总共4G RAM,缓存为329M,可用335MB。然后内存使用率将保持在此水平附近,直到我重新启动计算机。如果我在任务管理器中停止资源管理器实例,则屏幕将一直保持空白,并且HDD指示灯始终亮着,并且再也不会回来。通常,当我在任务管理器中停止资源管理器实例时,可以通过按Win + E重新调用它,或者它会自动重新启动。

好吧,非常好的内存管理!


[再次编辑]似乎很长一段时间后确实释放了一些使用的内存,但不是全部。在“任务管理器”中确实恢复了某些“缓存和可用”内存。我没有再等了,不知道会发生什么。


因此,您的主要问题是目录和子目录没有被删除吗?
Sandeep Bansal

@Jackey Cheung:您正在使用哪个版本的Windows?
西瓦·查兰

1
您可以编写一个批处理脚本来删除文件,而不是从顶层结构开始,而是从文件夹结构的第五层开始。那会将工作分解为许多单独的和连续的“ rm”

9
我必须知道,您到底是怎么得到一万亿个文件的……
摩押

2
一万亿个文件需要一个1 PB的文件表。如今最大的硬盘是几TB。您怎么可能得到这么大的分区?
user541686

Answers:


10

技术说明

大多数方法引起问题的原因是Windows尝试枚举文件和文件夹。几百个甚至几千个文件/文件夹只有几层深度,这并不是什么大问题,但是当您在数百万个文件夹中有数万亿个文件进入数十个级别时,那肯定会使系统瘫痪。

让我们“仅”拥有100,000,000个文件,Windows使用这样的简单结构来存储每个文件及其路径(这样可以避免分别存储每个目录,从而节省了一些开销):

struct FILELIST {                   // Total size is 264 to 528 bytes:
  TCHAR         name[MAX_PATH];     // MAX_PATH=260; TCHAR=1 or 2 bytes
  FILELIST*     nextfile;           // Pointers are 4 bytes for 32-bit and 8 for 64-bit
}

根据使用8位字符还是Unicode字符(使用Unicode)以及系统是32位还是64位,这将需要25GB到49GB的内存来存储列表(这非常简化的结构)。

原因 ,为什么 Windows会尝试删除前枚举文件和文件夹取决于您使用删除它们的方法,但两者资源管理器和命令解释器做(你可以看到的延迟,当您启动命令)。您还可以看到磁盘活动(HDD LED)闪烁,因为它从驱动器读取目录树。

解决这种情况的最佳选择是使用删除工具,该工具可以一次删除一个文件和文件夹。我不知道是否有任何现成的工具可以执行此操作,但是应该可以通过一个简单的批处理文件来完成。

@echo off
if not [%1]==[] cd /d %1
del /q *
for /d %%i in (*) do call %0 "%%i"

这是为了检查是否传递了参数。如果是这样,则它将更改为指定的目录(您可以在不带参数的情况下运行它以在当前目录中启动或指定目录,甚至在其他驱动器上也可以从该目录开始)。

接下来,它将删除当前目录中的所有文件。在这种模式下,它不应该枚举任何东西,而只是删除文件而不会占用太多(如果有的话)内存。

然后枚举当前目录中的文件夹并调用自身,将每个文件夹传递给它(自己)以向下递归。

分析

之所以应该起作用,是因为它没有枚举整个树中的每个文件和文件夹。它根本不枚举任何文件,而仅枚举当前目录中的文件夹(加上其余的父目录中)。假设任何给定的文件夹中只有几百个子目录,那么这应该不会太糟,并且与枚举整个树的其他方法相比,所需的内存肯定要少得多。

您可能想知道使用/r开关而不是使用(手动)递归。那是行不通的,因为当/r开关进行递归时,它会预先枚举整个目录树,而这正是我们想要避免的。我们想删除而不追踪。

比较方式

让我们将此方法与完全枚举方法进行比较。

您曾说过您有“数百万个目录”;假设是1亿。如果树是大致平衡的,并且假设每个文件夹平均大约有100个子目录,那么最深的嵌套目录将向下大约四个级别-实际上,整个树中将有101,010,100个子文件夹。(有趣的是100M如何分解为100和4。)

由于我们不枚举文件,因此我们仅需要跟踪每个级别最多100个目录名,即可4 × 100 = 400在任何给定时间最多跟踪目录。

因此,内存要求应为〜206.25KB,并且在任何现代(或其他方式)系统的限制之内。

测试

不幸的是(?)我没有一个在数百万个文件夹中包含数万亿个文件的系统,所以我无法对其进行测试(我相信最后一次计数,我有大约80万个文件),因此其他人将不得不尝试它。

警告

当然,内存并不是唯一的限制。该驱动器也将成为一个大瓶颈,因为对于您删除的每个文件和文件夹,系统都必须将其标记为空闲。值得庆幸的是,许多磁盘操作将被捆绑在一起(缓存)并成块而不是单独写出(至少对于硬盘驱动器,而不是可移动媒体),但是当系统读取时,它仍然会引起相当大的麻烦。并写入数据。


我很确定这是行不通的。我已经试过了 问题出在FOR循环中。事实证明,FOR将导致与直接发出DEL相同的问题。
张学友2013年

1
这取决于您使用的开关。如果您使用了/r开关,那么正如我所解释的,它将尝试枚举所有文件。如果使用该/d开关,它将仅枚举当前目录中的文件夹,因此,除非当前目录中有十亿个文件夹,否则不会造成问题。
Synetech

7

我无法说出数万亿个文件,但最近我使用以下方法对包含约180万个文件的旧文件共享进行了核对:

robocopy EmptyTMPFolder FolderToDelete /MIR /MT:16 /ETA /R:30 /W:5

“ EmptyTMPFolder”是一个空的本地目录。/ MIR选项将使目标看起来像源(空)。

这种方法的真正好处是重试选项(/ R:30)。这为吸收在此过程中可能发生的任何连接问题提供了机会。本地删除可能无法从这种方法中受益。

我没有用于比较时间的特定基准,但是与重试/等待选项中建议的其他选项相比,我更喜欢此基准。删除操作几乎立即开始。


我发现在大型网络驱动器文件夹树上运行清理时,这是迄今为止最有效的方法。谢谢你的提示。
托尼

5

删除所有文件夹将花费很长时间,并且您无能为力。您可以做的就是保存数据并格式化驱动器。这不是最佳选择,但可以(并且很快)起作用。

另一个选择可能是在可以从NTFS分区读取的实时CD上使用一些Linux发行版。我从个人经验中知道rm -rf folderName可以运行至少2天,而不会导致具有2GB RAM的系统崩溃。这将需要一段时间,但至少会完成。


1
嗯,Linux。我在考虑Cygwin。尽管应该使用Windows下划线功能,但只是想知道这是否会对情况有所不同。我会尝试的。
张学友

1
您可以使用git bash
raindrop

4

嗯..我不想知道你是怎么创造了那么多。

发生的事情是Explorer在开始删除之前试图枚举每个文件,并将信息存储在内存中。显然有太多方法了。

您是否尝试过命令 rmdir /s?只要它实际上删除找到的文件,而不是等待每个要枚举的文件,它就可以工作。

有多少层子目录?如果只有一个或其他一些较低的数字,则可能需要手动递归的快速批处理文件。

但是,任何方法都需要一段时间。


当然,除了soandos关于重新格式化的建议。这样会很快,但是如果这是您的系统驱动器,则必须重新安装Windows。
Bob

我很确定必须进行枚举,以便程序知道接下来要删除的内容。rmdir无法删除找到的文件,因为它是从顶部开始的,必须以某种方式遍历。唯一的问题是它存储了多少多余的信息。
soandos 2012年

@soandos Explorer会计算每个文件。我在考虑一种实现DFS枚举样式的方法:在分支上尽可能向下移动,在击中文件时删除,然后再返回。换句话说,递归就是这样rm -rf做的。相对浅的目录结构最适合。我不确定是否rmdir /s这样做。它应该
Bob

1
@JackeyCheung rmdir /?/s Removes all directories and files in the specified directory in addition to the directory itself. Used to remove a directory tree.换句话说,该/s标志也会删除文件。您如何使用del?是的,最好rm -rf按照soandos的建议使用。
Bob

1
@JackeyCheung:你错了。如果为rmdir提供/ s标志,它将删除文件和目录。
哈里·约翰斯顿

4

此类问题的一个可能原因是精简配置,通常在SAN环境中发现。某些固态驱动器可能会出现相同的问题。在这种情况下,此配置更改可能会解决您的问题:

fsutil behavior set DisableDeleteNotify 1

请注意,此更改可能会影响固态驱动器的性能,并可能阻止SAN驱动器的自动和/或手动精简。



3

这可能是您的防病毒/恶意软件占用了所有内存,然后导致系统崩溃。

Windows本身在删除大量文件方面没有问题,尽管它肯定比大多数非Microsoft文件系统上的类似操作要慢。


好点!当然值得一看。
张学友

我已经关闭了防病毒功能,但仍然像以前一样吃掉了内存。
张学友

关闭防病毒程序也无助于进程停止后释放内存。
张学友

@JackeyCheung:它是哪个防病毒程序?有些实际上并没有完全关闭...
Ben Voigt 2012年

2

您可能会遇到的问题是,删除文件/文件夹时目录不会压缩,因此,如果其中有一个包含100万个文件的文件夹并删除其中的前500k个文件夹。目录的开头有很多块,所有意图都为空白。

但是,以防万一那里有文件,浏览器和命令提示符仍然必须浏览这些块。可能有用的方法是将文件夹从树上的某个位置“移动”到驱动器底部的新文件夹,然后删除该新文件夹。移动文件夹只会将指针移动到该文件夹​​,因此它应该快速移动,而实际上不会将其下的所有文件移动到驱动器上的新空间。

您可能要尝试的另一件事是在删除一堆文件之后,使用第三方工具(如“ PerfectDisk”)压缩文件夹。


2

在尝试各种方法来删除超过1000万个融合日志文件时,我注意到平均可以在10分钟内删除3万个文件。1000万个文件大约需要55个小时...

使用以下脚本,删除率增加了〜75%。文件列表是由并发进程创建和执行的,这些并发进程增加了磁盘操作(但不是线性的)。我正在显示4个fork,但是两个就足够了。

有一个使用PowerShell的选项,可以大大减少准备列表所需的时间。

顺便说一句,我测试了使用两个直接del运算允许发生冲突,但是与单个del运算相比,整体删除时间没有明显减少。尽管创建删除列表可能不理想,但是节省时间是值得的。

@ECHO OFF
SETLOCAL EnableDelayedExpansion

IF /I "%~1"=="timestamp" (
    CALL :ECHOTIMESTAMP
    GOTO END
)

rem directory structure to delete
SET "DELETE=c:\_delete\Content.IE5\???<<<change this>>>???"
rem primary list of discovered files to delete
SET "LIST=delete-list.txt"
rem base path for sub-lists
SET "LISTBASE=.\delete-list"
SET "TITLE=Batch Delete Process"
rem specifies number of batch delete processes to spawn
SET FORKS=4
rem when set to 1, use PowerShell for list building and delete.  Definitely improves time to build fork sublists
SET POWERSHELL=0
rem specifies max files to delete when greater than 0
SET MAXDEL=1000000

rem prompt for confirmatoin
SET /P CONT=About to delete all files and directories from !DELETE!. Continue (Y/N)?
IF /I NOT "!CONT!"=="Y" EXIT /B

CALL :ECHOTIMESTAMP

ECHO Accumulating list of files to delete...
dir /b /s "!DELETE!" > "!LIST!"

FOR /F "delims=" %%c IN ('type "!LIST!" ^| find /C ":"') DO SET "COUNT=%%c"
ECHO Discoverd !COUNT! files and directories to delete.

IF  %MAXDEL% GTR 0 IF !COUNT! GTR %MAXDEL% (
    SET COUNT=%MAXDEL%
    ECHO Limiting files/directories deletion count to  !COUNT!
)

CALL :ECHOTIMESTAMP
ECHO Preparing !FORKS! delete processes...
SET /A LIMIT=!COUNT!/!FORKS!

IF !POWERSHELL! EQU 1 (
    SET SKIP=0
    FOR /L %%n IN (1,1,!FORKS!) DO (
        SET "CURRENT=!LISTBASE!-%%n.txt"
        SET "LIST[%%n]=!CURRENT!"
        DEL /f /q "!CURRENT!" > nul 2>&1
        IF %%n EQU !FORKS! SET /A LIMIT+=!FORKS!
        SET CMD=type \"!LIST!\" ^| select -first !LIMIT! -skip !SKIP!
        powershell -command "& {!CMD!}" > "!CURRENT!"
        SET /A SKIP+=!LIMIT!
    )

) ELSE (
    rem significantly slower but no PowerShell.
    SET L=1
    SET N=!LIMIT!
    SET C=0
    FOR /F %%f  IN (!LIST!) DO (
        IF !C! LSS !COUNT! (
            IF !N! GEQ !LIMIT! (
                SET "CURRENT=!LISTBASE!-!L!.txt"
                SET "LIST[!L!]=!CURRENT!"
                DEL /f /q "!CURRENT!" > nul 2>&1
                SET /A L+=1
                SET /A N=0
            ) ELSE (
                SET /A N+=1
            )
            ECHO %%f >> "!CURRENT!"
        ) ELSE (
            GOTO ENDLIST
        )
        SET /A C+=1
    )
)
:ENDLIST

CALL :ECHOTIMESTAMP
ECHO Forking !FORKS! delete processes...
FOR /L %%t IN (1,1,!FORKS!) DO (

    SET "CURRENT=!LIST[%%t]!"
    IF !POWERSHELL! EQU 1 (
        SET "TAB=        "
        SET BLANK=!TAB!!TAB!!TAB!!TAB!!TAB!!TAB!!TAB!!TAB!
        SET BLANK=!BLANK!!BLANK!!BLANK!!BLANK!
        SET DEL_CMD=del -force -recurse -ea SilentlyContinue -path \"$_\"
        SET $W_CMD=$w=$Host.UI.RawUI.WindowSize.Width
        SET $S_CMD=$s=\"$_\";$i=[math]::max^(0,$s.length-$w^);$s=$s.substring^($i, $s.length-$i^);$s=\"$s !BLANK!\";$s=$s.substring^(0,[math]::min($w,$s.length^)^)
        SET ECHO_CMD=Write-Host \"`r$s\" -NoNewLine
        SET CMD=type \"!CURRENT!\" ^| %% {!DEL_CMD!; !$W_CMD!; !$S_CMD!; !ECHO_CMD!}
        SET CMD=powershell -command "^& {!CMD!}" ^& ECHO\ ^& "%~dpnx0" timestamp
        ECHO CMD !CMD!
    ) ELSE (
        SET LOOP=FOR /F %%%f IN ^(!CURRENT!^) DO
        SET OP=del "%%%f"
        SET CMD=@ECHO OFF ^&^& ^(!LOOP! !OP!  ^> nul 2^>^&1 ^)  ^& "%~dpnx0" timestamp
    )
    rem ECHO !CMD!
    START "!TITLE! %%t" cmd /k  !CMD!
)

GOTO END

:ECHOTIMESTAMP
SETLOCAL
    SET DATESTAMP=!DATE:~10,4!-!DATE:~4,2!-!DATE:~7,2!
    SET TIMESTAMP=!TIME:~0,2!-!TIME:~3,2!-!TIME:~6,2!
    ECHO !DATESTAMP: =0!-!TIMESTAMP: =0!
ENDLOCAL
GOTO :EOF

:END
ENDLOCAL
EXIT /B

2

尝试此操作,然后根据需要进行修改。

它是基于Synetech的技术说明分析在Win2003上经过测试的脚本,13年10月15日在15:22回答

@echo off

rem ### USE FULL PATH AS FIRST ARGUMENT TO SCRIPT, DONT FORGET QUOTES !
rem ### If you move this script, fix script path variable...
SET STATICFULLSCRIPTPATH="D:\scripts\FOLDER"
SET SCRIPTNAME="DeleteFast.bat"

rem ### If CD fails or IF condition has problems,
rem ### and DEL or RMDIR runs, its better to be at safe place.
if not exist "%TEMP%\SAFE" mkdir "%TEMP%\SAFE"
if exist "%TEMP%\SAFE" cd /d "%TEMP%\SAFE"

rem ### Fix quote overflow
set var1="%1"
set var1=%var1:"=%

if not [%1]==[] (
    cd /d "%var1%"

    echo # KILLING F AT : "%var1%"
    rem ### uncomment to do damage! ### 
    rem # del /f/q * > nul

    for /d %%i in (*) do call "%STATICFULLSCRIPTPATH%\%SCRIPTNAME%" "%var1%\%%i"

    rem ## Finish deleting the last dir
    cd /d "%var1%\.."

echo # KILLING  DIR : "%var1%"
rem ## Remove dir.. first try
rmdir /q "%var1%"

if exist "%var1%" (
    rem ## Remove dir.. second try
    rem ## If thousands of files/dirs had permission/ownership problems, then prepare to wait a long time.
    rem ### uncomment to do damage! ### 
    rem #cmd.exe /c takeown /f "%var1%" && icacls "%var1%" /grant SOMEBODY:F

    rem ### uncomment to do damage! ### 
    rem #rmdir /s/q "%var1%"
)
)

cd /d "%STATICFULLSCRIPTPATH%"

Testrun ..有不同嵌套的文件夹,如A1到A4,B1到B4和C1到C4。

Z:\>"D:\scripts\FOLDER\DeleteFast.bat" "D:\scripts\TESTF\DIRS"
# KILLING F AT : "D:\scripts\TESTF\DIRS"
# KILLING F AT : "D:\scripts\TESTF\DIRS\A1"
# KILLING F AT : "D:\scripts\TESTF\DIRS\A1\B1"
# KILLING F AT : "D:\scripts\TESTF\DIRS\A1\B1\C 1"
# KILLING  DIR : "D:\scripts\TESTF\DIRS\A1\B1\C 1"
# KILLING  DIR : "D:\scripts\TESTF\DIRS\A1\B1"
# KILLING F AT : "D:\scripts\TESTF\DIRS\A1\B2"
# KILLING F AT : "D:\scripts\TESTF\DIRS\A1\B2\C 2"
# KILLING  DIR : "D:\scripts\TESTF\DIRS\A1\B2\C 2"
# KILLING  DIR : "D:\scripts\TESTF\DIRS\A1\B2"
# KILLING  DIR : "D:\scripts\TESTF\DIRS\A1"
# KILLING F AT : "D:\scripts\TESTF\DIRS\A2"
# KILLING F AT : "D:\scripts\TESTF\DIRS\A2\B3"
# KILLING F AT : "D:\scripts\TESTF\DIRS\A2\B3\C 3"
# KILLING  DIR : "D:\scripts\TESTF\DIRS\A2\B3\C 3"
# KILLING  DIR : "D:\scripts\TESTF\DIRS\A2\B3"
# KILLING  DIR : "D:\scripts\TESTF\DIRS\A2"
# KILLING F AT : "D:\scripts\TESTF\DIRS\A3"
# KILLING F AT : "D:\scripts\TESTF\DIRS\A3\B4"
# KILLING F AT : "D:\scripts\TESTF\DIRS\A3\B4\C 4"
# KILLING  DIR : "D:\scripts\TESTF\DIRS\A3\B4\C 4"
# KILLING  DIR : "D:\scripts\TESTF\DIRS\A3\B4"
# KILLING  DIR : "D:\scripts\TESTF\DIRS\A3"
# KILLING F AT : "D:\scripts\TESTF\DIRS\A4"
# KILLING  DIR : "D:\scripts\TESTF\DIRS\A4"
# KILLING  DIR : "D:\scripts\TESTF\DIRS"

D:\scripts\FOLDER>

我无法发表评论(网站抱怨我的声誉),所以我在这里添加评论。

Bjv的解决方案创建了无用的临时文件列表。然后再次重申他们要做的实际工作。 /superuser//a/892412/528695

Synetech的原始脚本对我不起作用。 /superuser//a/416469/528695

@echo off
if not [%1]==[] cd /d %1
echo "%1"
for /d %%i in (*) do call %0 "%%i"

结果..

Z:\>C:\privscripts\TESTF\DeleteFastORIGINAL.bat "C:\privscripts\TESTF\DIRS"
""C:\privscripts\TESTF\DIRS""
""A1""
""B1""
""C1""
The system cannot find the path specified.
""B2""
The system cannot find the path specified.
""A2""
The system cannot find the path specified.
""A3""
The system cannot find the path specified.
""A4""

C:\privscripts\TESTF\DIRS\A1\B1\C1>

当他说Synetech的脚本不起作用时,我可以验证@ user4350129是正确的-我在Win7x64机器上有相同的行为。
leinad13

该死的我的脚本也不是完美的,如果arg丢失和引号溢出打破了takeown anc icacls命令..我也只检查了文件夹而不是文件。
EO

2

以前我只有1000万个文件时遇到类似的问题,但是在服务器2003中,我使用ftp服务器/客户端删除文件,而客户端则删除文件和文件夹。这是一个缓慢的解决方案,但效果很好。

NTFS中的MFT可能会遇到第二个问题,该问题没有解决方案,MFT是在win 2003中(我不确定Microsoft在win 2003之后是否有解决方案)以增量方式存储所有文件的数组。拥有上万亿个文件的大小将是疯狂的,在我的情况下,MFT拥有1700万条记录,而MFT的大小约为19GB,仅有45000个文件,我在其他系统上进行了测试,看起来MFT将拥有100万条记录大约为1 GB。

您可以使用以下命令检查MFT的状态:

defrag C: /a /v
  • C: -单位字母
  • /a -分析
  • /v -详细

另一个棘手的解决方案,因为没有可以缩小MFT的工具,这些工具仅用0填充文件和属性的名称,仅此而已,但是您可以使用VMware Converter或另一种P2V并基于您的服务器,通过这种方式,您将解决与MFT相关的所有问题,我从未测试过V2P的转换,现在我仅在虚拟环境中工作,但是我在Internet上看到了许多有关它的信息。

那赢了2003年,它现在可以正常运行,MFT的大小为40MB,一切正常,如果您想告诉我更多有关备份,碎片整理或其他与数百万个小文件有关的任务的信息。



1

由于一次删除所有文件会占用过多的内存,因此您需要一次删除一个文件的方法,但过程会自动进行。在Unix风格的shell中,这种事情要容易得多,所以让我们使用Cygwin。以下命令生成普通文件列表,将该列表转换为rm命令序列,然后将生成的脚本提供给外壳程序。

 find dir \! -type d | sed 's/^/rm /' | sh

该脚本即使在生成时也正在执行,并且没有循环,因此外壳(希望)不必创建任何大的临时文件。由于脚本的长度为数百万行,因此肯定会花费一些时间。您可能需要调整rm命令(也许我应该使用-f?,但是您比我更了解您的文件)才能使它工作。

现在您只剩下目录了。这就是事情变得艰难的地方。也许您已经删除了足够的文件,以便可以在rm -rf不耗尽内存的情况下执行操作(它可能比另一个脚本快)。如果没有,我们可以改写这个Stackoverflow答案

 find dir | perl -lne 'print tr:/::, " $_"' | sort -n | cut -d' ' -f2 | sed 's/^/rmdir /' | sh

同样,这次可能需要进行调整sort,以避免创建巨大的临时文件。


1

我前段时间也遇到过同样的问题。我写了一个小工具来完成这个任务:递归删除目录。它不会枚举文件,也不会消耗太多内存(最大为O(n + m),其中n =最大目录深度,m =子目录之一中的最大文件/目录数)。它可以处理长文件路径(> 256个字符)。如果您能解决您的问题,我很想获得反馈。

您可以在这里找到它:https : //github.com/McNetic/fdeltree(可在releases文件夹中执行)


1

我发现此线程正在寻找一种比删除支持的多个服务器上的300万个文件更好的方法。上面是解决复杂IMO的方法,因此我最终使用了我在Windows(在Server 2003上)中使用“ FORFILES”命令行工具的已知方法。

无论如何,下面是我用来从命令行删除文件夹中所有文件的FORFILES命令。

forfiles / P“您的文件夹路径(例如C:\ Windows \ Temp)” / C“ cmd / c echo @file和del / f / q @file”

上面的ECHO也是被删除到屏幕上的文件的名称,但这仅仅是因为我想看到它实际在做某事的进度,如果您不回声,它看起来就像DOS框已挂起,甚至尽管它按预期完成了工作。

启动确实需要一些时间,即看起来好像暂时不执行任何操作(大约300万个300万个文件),但是最终您应该看到文件名在删除时开始出现。此方法还需要很长时间才能删除文件(如果没有回显,删除时间可能会减少吗?),但是它的确可以在不使计算机崩溃的情况下正常工作,因为在我的服务器上,forfiles在删除过程中使用了约1,850Kb的内存。 。

如果您的服务器具有自动注销功能(因为您需要保持鼠标移动),则删除的持续时间可能会导致问题(建议您以控制台用户的身份运行,或者通过第三部分工具(例如LanDesk或SCCM等)(或MouseJiggle)运行。可执行程序))

无论如何,以为我会分享我的答案,祝你好运!

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.