本帖最后由 alredstone 于 2022-5-18 12:36 编辑
=============== 以下为最近一次编辑的内容 ===============
目标:遍历每个文件获取其创建日期,并和指定日期进行比对,最后复制或跳过。
结论:继续求教更高执行效率的处理办法。
以下为讨论部分:
关于bat执行效率的问题,论坛里有较多讨论,@随风 版主也做了汇总 http://www.bathome.net/thread-4828-1-1.html 。 然而执行效率问题依旧是绕不过的坎。
在坛友 @idwma 的建议下,我尝试将多次调用 call 和 goto 改为 for 和 if 语句,因此也引入了 管道 和 findstr 。最终测试结果发现,两者对于1000个文件的处理,差异不大(3秒以内,重复三次)。
目前可获得的结论如下:重复调用 call 和 goto 与重复使用 管道 和 findstr ,执行效率相当。考虑到 call 和 goto 的使用有助于增加代码的可读性(尤其是对新手而言),在没有更好选择的情况下,建议使用 call 和 goto 。
依据坛友 @idwma 的建议,更改后的代码如下:- :identify_copy
- setlocal enabledelayedexpansion
- set "tmpdrctry=D:\newfolder"
- set strttm=%time%
- for /f "tokens=* delims=" %%z in ('dir /s/b/a-d-h-s') do (
- for /f "tokens=1" %%a in ('dir "%%z" /tc ^|findstr /e "%%~xz"') do (
- set "fpath=%%z"
- set "fdrctry=%%~dpz"
- set "fcd=%%a"
- if "!fcd!" GEQ "2022/01/01" (call set "tmpdrctry2=%%fdrctry:%cd%=%tmpdrctry%%%" &xcopy "!fpath!" "!tmpdrctry2!" /v/s)
- )
- )
- echo Process started at %strttm%, ended at %time%.
- pause
复制代码 .
=============== 以下为原帖内容 ===============
操作目标:复制当前文件夹中2022年1月1日之后创建的文件至指定文件夹(D:\newfolder),须保持目录树。
使用代码如下,因多次调用 call 和 goto,导致执行效率很低(总文件数约5000个)。
求教:如何提高执行效率。- :identify_copy
- set strttm=%time%
- set "tmpdrctry=D:\newfolder"
- for /f "tokens=* delims=" %%z in ('dir /s/b/a-d-h-s') do (
- set "fpath=%%z"
- set "fdrctry=%%~dpz"
- call :acqrdt
- )
- echo Process started at %strttm%, ended at %time%.
- pause
-
- :acqrdt
- for /f "skip=4 tokens=1" %%a in ('dir "%fpath%" /tc') do (
- set "fcd=%%a"
- call :dtprcss & goto :EOF
- )
-
- :dtprcss
- if "%fcd%" GEQ "2022/01/01" (goto copynf)
- goto :EOF
-
- :copynf
- call set "tmpdrctry2=%%fdrctry:%sdrctry%=%tmpdrctry%%%"
- xcopy "%fpath%" "%tmpdrctry2%" /v/s
- goto :EOF
复制代码
|