在批处理文件中复制(移动)文件的快速方法

A C*_*ger 2 windows performance copy move batch-file

我在一个目录中有大量文件需要验证。

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

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

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

这段代码本身就像设计的那样工作正常,但发现了一个额外的问题:速度。

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

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

附:我试过/move/xcopy命令,但没有看到太大的差异。


由于有上下文请求,我附上完整代码:

@echo off
pushd %~dp0

set DirN=-1
:Check_DirN
set LeftOver=
for /f "tokens=*" %%a in ('dir /b /a-d ^|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 /a-d ^|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
Run Code Online (Sandbox Code Playgroud)

注释

  1. 我曾经set /a调整过%limit%,因为findstr /n /v
  2. 此脚本将被编译为 .bat 文件,并将放入包含要排序的文件的文件夹中。

示例环境(最小化):

父文件夹中有 1,500 个文档,其子文件夹名为 0,2 和 4。该脚本将被放置在父文件夹内并被执行。


脚本要求:

  1. 创建编号从 0 开始的目录,仅当目录不存在时
  2. 将 700 个文件移动到新创建的目录。即使文件数少于 700,也会移动文件。
  3. 重复任务 1 和 2,直到父目录中没有剩余文件。

脚本执行结果示例:

在父文件夹中有名为 0、1、2、3、4 和 5 的子文件夹,其中包含一个脚本。子文件夹 1 和 3 中各有 700 个文档。子文件夹 5 中将有 100 个文档。子文件夹 0、2 和 4 中没有变化。

Com*_*mpo 5

我提供这个作为 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
Run Code Online (Sandbox Code Playgroud)