windows - 在批处理文件中复制( move )文件的快速方法

标签 windows performance batch-file copy move

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

问题是,文件资源管理器加载文件列表的时间太长,我的整个计算机都变慢了。

所以我写了下面的代码通过将一定数量的文件(显示为 %limit% 并且将是 700) move 到编号的文件夹(显示为 %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

这段代码本身在设计时运行良好,但发现了一个额外的问题:速度。

由于我正在处理占用 20 GB 磁盘空间的文件,因此代码似乎需要很长时间才能以这种方式 move 文件。

有没有更快的复制( move )文件的方法?

附言。我尝试过 /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

评论

  1. 我使用 set/a 来调整由于 findstr/n/v
  2. 而关闭的 %limit%
  3. 此脚本将被编译为 .bat 文件,并将放入包含要排序的文件的文件夹中。

示例环境(最小化):

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


脚本要求:

  1. 仅当目录不存在时才从0开始创建编号的目录
  2. 将 700 个文件 move 到新创建的目录中。文件将被 move 即使文件数量少于 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

关于windows - 在批处理文件中复制( move )文件的快速方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41489945/

相关文章:

windows - 如何在不重启的情况下使用 SEE_MASK_NOZONECHECKS 运行 msi

performance - Prolog 性能和递归类型

ios - 提高绘图性能(针对 Dudel 应用程序)

java - 如何真正对 Java 应用程序的内存使用情况进行基准测试

batch-file - 在批处理文件中获取两个目录的路径

windows - 获取未知文件名以批量压缩文件

windows - 为什么 64 位进程不能使用 32 位 dll?

时间:2019-05-17 标签:c#wcf文件和文件夹浏览器

windows - 在预构建事件中设置环境变量并在编译步骤中使用

windows - 为什么只执行此 Windows 批处理文件的第一行,但所有三行都在命令 shell 中执行?