Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Batch file 按相反顺序删除文件_Batch File_Delete File - Fatal编程技术网

Batch file 按相反顺序删除文件

Batch file 按相反顺序删除文件,batch-file,delete-file,Batch File,Delete File,我每天都要删除很多文件(200k+),因此我编写了一个批处理文件,执行以下调用: del *.* /S /F /Q 我不关心生成的任何文件,所以*.*可以。这些文件会按字母顺序删除,但它们仍然需要几分钟,我想加快速度。我认为按逆字母顺序删除文件会很好,因为这样我可以并行执行两个批处理文件。我知道python脚本会使它变得容易,但我想知道是否有一种方法可以在批处理文件中实现这一点。如果您有更简单的方法,我愿意接受建议。我设计了一个多线程解决方案,可以充分利用不同时间设备中可能出现的未使用的时间间

我每天都要删除很多文件(200k+),因此我编写了一个批处理文件,执行以下调用:

del *.* /S /F /Q

我不关心生成的任何文件,所以
*.*
可以。这些文件会按字母顺序删除,但它们仍然需要几分钟,我想加快速度。我认为按逆字母顺序删除文件会很好,因为这样我可以并行执行两个批处理文件。我知道python脚本会使它变得容易,但我想知道是否有一种方法可以在批处理文件中实现这一点。如果您有更简单的方法,我愿意接受建议。

我设计了一个多线程解决方案,可以充分利用不同时间设备中可能出现的未使用的时间间隔。这个想法是以最大的速度运行这个过程,当它在没有停顿的情况下连续使用时,允许最慢的设备(即硬盘)运行。当然,这种方法的结果将完全取决于计算机硬件

下面的批处理文件接受第一个参数,即将创建的异步线程数。这样,文件总数将除以该数字,每个生成的文件块将由不同的同步线程处理

@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开始改变参数,直到某个值给出的计时大于前一个值;然而,我知道这对你来说很困难。但是,您可以在每次运行程序时更改参数并记下计时。如果每次运行中的文件集相似,您将确定参数的最佳值


如果您完成了这些计时测试,请发布结果!我想回顾一下

并行执行两个脚本甚至可能会减慢这个过程,因为硬盘驱动器头必须前后跳跃。@David:很好。对于现代SSD来说,这不是什么问题,但并行执行是一种处理CPU性能问题的工具,而不是I/O性能问题。另一方面,生成一组重叠的异步请求可以让驱动器控制器对它们进行排序,这可以显著提高旋转介质的吞吐量。或者简单地允许头到流写入,而在请求之间必须返回到用户模式程序的同步调用可能会错过截止日期,并需要整个额外的循环。@Ben Voigt:这还不算幸运。“总是得到更糟糕的结果。@DavidJashi:电梯排序传统上只能在企业级RAID控制器中找到。谢天谢地,SSD现在已经是商品硬件,并且绕过了所有与搜索时间相关的问题。您可以使用Aacini的多任务批处理来加快删除过程。这看起来非常有希望。我还没有试过这个。我认为这是迄今为止最佳的解决方案,排程任务删除文件,因为我漏掉了一条信息-文件的位置偏离,以及大小。我需要从与昨天不同的位置删除价值40万(2千兆)的数据。因此,调度不起作用。我该怎么称呼这个?