我必须每天删除大量文件(200k +),所以我写了一个批处理文件来执行以下调用:
del *.* /S /F /Q
我不关心生成的任何文件,因此*.*
没问题。文件按字母顺序删除,但它们仍然需要几分钟,我想加快速度。我以反向字母顺序删除文件会很好,因为我可以并行执行两个批处理文件。我知道一个python脚本会让它变得容易,但我想知道是否有办法在批处理文件中执行此操作。如果你有一个更简单的方法,我愿意接受建议。
答案 0 :(得分:0)
我设计了一个多线程解决方案,可以充分利用不同时间设备中可能出现的未使用时间间隔。这个想法是以最大速度运行该过程,允许最慢的设备(即:硬盘)在连续使用时没有暂停。当然,这种方法的结果完全取决于计算机硬件。
下面的批处理文件在第一个参数中包含将要创建的异步线程的数量。这样,文件总数将除以此数字,每个生成的文件块将由不同的同时线程处理。
@echo off
setlocal EnableDelayedExpansion
rem Multi-thread file deleting program
if "%1" equ "Thread" goto ProcessBlock
rem Create the list of file names and count they
cd C:\TheFolder
set numFiles=0
(for /F "delims=" %%f in ('dir /S /A-D *.*') do (
echo %%f
set /A numFiles+=1
)) > "%temp%\fileNames.tmp"
rem Get number of threads and size of each block
set numThreads=%1
if not defined numThreads (
set /A numThreads=1, blockSize=numFiles
) else (
set /A blockSize=numFiles/numThreads
)
rem Create asynchronous threads to process block number 2 up to numThreads
if exist thread.* del thread.*
for /L %%t in (2,1,%numThreads%) do (
echo %time% > thread.%%t
start "" /B "%~F0" Thread %%t
)
rem Process block number 1
set count=0
for /F "usebackq delims=" %%f in ("%temp%\fileNames.tmp") do (
del "%%f"
set /A count+=1
if !count! equ %blockSize% goto endFirstBlock
)
:endFirstBlock
rem Wait for all asynchronous threads to end
if exist thread.* goto endFirstBlock
rem Delete the auxiliary file and terminate
del "%temp%\fileNames.tmp"
goto :EOF
rem Process blocks 2 and up (asynchronous thread)
:ProcessBlock
set /A skip=(%2-1)*blockSize, count=0
for /F "usebackq skip=%skip% delims=" %%f in ("%temp%\fileNames.tmp") do (
del "%%f"
set /A count+=1
if !count! equ %blockSize% goto endBlock
)
:endBlock
del thread.%2
exit
上述批处理文件假定文件名没有感叹号。如果需要这一点,可能会包含相应的setlocal / endlocal命令,但此详细信息会降低该过程的速度。
理想情况下,您应该使用相同的文件集进行多次计时测试,从1开始变化参数并逐渐增长,直到值给出大于前一个的时间;但是,我知道这对你来说很难。但是,每次运行程序时都可以更改参数并记下时间。如果每次运行的文件集相似,您将确定参数的最佳值。
如果您完成这些计时测试,请发布结果!我想回顾一下。