快速的方法来复制(移动)batch file中的文件

我在一个目录中有大量的文件需要validation。

问题是,文件浏览器花费太多的时间来加载文件列表,我的整个计算机变得缓慢。

所以我写了下面的代码,通过移动一定数量的文件(显示为%limit% ,并将700)到编号文件夹(显示为%DirN% )来对文件进行%DirN%

 for /f "tokens=1-2 delims=:" %%a in ('dir /b /ad ^|findstr /n /v ".bat .cmd .txt"') do if %%a lss %limit% robocopy "%cd%" "%cd%\%DirN%" "%%b" /mov >nul 

这个代码本身就像devise一样工作得很好,但是另外一个问题是速度。

由于我正在处理占用20 GB磁盘的文件,因此代码似乎需要永远以这种方式移动文件。

有没有更快的方法来复制(移动)文件?

PS。 我试过/move/xcopy命令,但没有看到太多的差异。


既然有一个上下文的请求,我附上完整的代码:

 @echo off pushd %~dp0 set DirN=-1 :Check_DirN set LeftOver= for /f "tokens=*" %%a in ('dir /b /ad ^|findstr /v ".bat .cmd .txt"') do (set LeftOver=%%a) if "%LeftOver%"=="" goto Done set /a DirN+=1 if exist "%cd%\%DirN%" goto Check_DirN :Create md %DirN% :Move cls echo Moving files to Directory %DirN%... set /a limit=700+2 for /f "tokens=1-2 delims=:" %%a in ('dir /b /ad ^|findstr /n /v ".bat .cmd .txt"') do if %%a lss %limit% robocopy "%cd%" "%cd%\%DirN%" "%%b" /mov >nul goto Check_DirN exit :Done del list.txt>nul 2>&1 echo Task Done! pause>nul 

注释

  1. 我用set /a调整由于findstr /n /v而closures的%limit%
  2. 这个脚本将被编译成.bat文件,并将被放到一个包含文件的文件夹中进行sorting。

示例环境(最小化):

父文件夹中有1,500个子文件夹,名称分别为0,2和4。 脚本将被放置在父文件夹的内部并被执行。


脚本要求:

  1. 只有在目录不存在的情况下,才能从0开始编号
  2. 移动700个文件到新创build的目录。 即使文件数小于700,文件也会被移动。
  3. 重复任务1和2,直到父目录中没有剩余的文件。

脚本执行的示例结果:

有一个名为0,1,2,3,4和5的子文件夹在父文件夹中具有脚本。 在子文件夹1和3中将有700个文档。在子文件夹5中将有100个文档。在子文件夹0,2和4中将不会有变化。

我提供这个作为Magoo的答案的替代。 我已经使用了您的初始RoboCopy命令,因为这是一个外部命令,删除了对外部FindStr的依赖关系,希望能够考虑到任何速度差异。

 @Echo Off If /I Not "%__CD__%"=="%~dp0" PushD "%~dp0" 2>Nul||Exit/B SetLocal EnableDelayedExpansion Set "DirN=-1" :Check_DirN Set/A "DirN+=1" If Exist "%DirN%" GoTo Check_DirN Set "limit=700" For %%A In (*.bat *.cmd *.txt) Do ( If Not Exist "%DirN%" MD "%DirN%" If /I Not "%%~nxA"=="%~nx0" RoboCopy . "%DirN%" "%%A" /MOV 1>NUL Set/A "limit-=1" If !limit! Lss 0 GoTo Check_DirN ) Echo(Task Done! Timeout -1 1>Nul 
 @echo off pushd %~dp0 set DirN=-1 :Check_DirN set /a DirN+=1 if exist "%cd%\%DirN%" goto Check_DirN md %DirN% set /a limit=700 for /f "tokens=1* delims=:" %%a in ('dir /b /ad ^|findstr /v ".bat .cmd .txt" ^|findstr /n "." ') do ( if %%a gtr %limit% goto Check_DirN set /a limit=0 echo(move "%%b" "%cd%\%DirN%\" ) if %limit% neq 0 rd %DirN% echo Task Done! pause>nul 

为了测试目的,所需的MOVE命令仅仅是ECHO在确认命令正确之后 ,将ECHO(MOVEMOVE移动文件实际移动)。Append >nul取消报告消息(例如1 file moved

首先,创建新的目录。 没有必要参与这个。

接下来,建立您的限制,然后选择并编号您的directorylist并移动每个文件依次到目的地。

达到文件限制时,返回并创建一个新的目标目录。

请注意, delayedexpansion被利用。 %limit%将被解析阶段的值所取代,如果任何文件被移动,它将被设置为0。 由于解析器已经完成了它的实际值的替换,所以这不会影响循环,但是可以在循环结束之后检测到“文件被移动”了。

如果没有文件被移动,那么limit在退出for循环时将保持非零,因此新创建的目录是空的并且可以被删除。

我建议你尝试一个虚拟测试目录中的一个较小的限制,以确保它的工作。 应该大大加快。

[编辑 – 创建目录 ,检查它不存在] [编辑2-级联2 findstr – 第一个排除扩展名,第二个号码的行。 试图使用一个findstr将根据dir命令中的位置编号,因此被排除的文件将被分配一个数字,但不被传送; 因此移动的数量将会不足limit

请注意,因为这些文件实际上并没有随着echo(move在原地echo(move ,相同的文件列表会一遍又一遍地重复,当move被调用时,明显移动的文件将不会在leter迭代]