标题: [文本处理] 批处理复制时间段内的文件速度太慢 请大家解疑!!! [打印本页]
作者: iamstar 时间: 2009-10-9 09:41 标题: 批处理复制时间段内的文件速度太慢 请大家解疑!!!
- @echo off &setlocal enabledelayedexpansion
-
- set time1=
- set /p time1=起始时间(20090721)
- set time2=
- set /p time2=结束时间(20090723)
-
- md "C:\Documents and Settings\Administrator\桌面\p\%time2%"
-
- for /r \\192.168.1.3\p\123 %%a in (*.*) do (
- set var=%%~ta
- set var=!var:~0,4!!var:~5,2!!var:~8,2!
- echo dir /ta
- IF !VAR! GEQ !TIME1! IF !VAR! LEQ !TIME2! (
- xcopy "%%a" "C:\Documents and Settings\Administrator\桌面\p\%time2%")
- )
- if %errorlevel% == 0 echo OK
- if %errorlevel% == 1 echo NG
- pause
复制代码
- 第一个问题:
- 以上回显的返回值是否是FOR命令的返回值,我在运行过程中,复制成功还是失败都回显OK,例如:假设123文件内不存在时间段内的文件,运行命令回显OK。
- 但是把md创建文件夹的程序去掉,复制成功就显示OK,失败显示NG。例如:假设123文件内不存在时间段内的文件,运行命令回显NG。
- 希望看下有什么解决的方法。
复制代码
- 第二个问题:
- 还有就是运行过程中,速度特别慢。。是否是因为命令运行检索123文件夹内所有文件,来一一比对他们的日期是否在时间段内,在进行复制。
- 123文件夹内大约有10000个300K左右的文件,是否是造成运行过慢的原因。
- 是否还有其他复制时间段的方法,来解决复制时间过慢的问题。。
- 一个300K的文件用上面的批处理大约复制12秒,复制10000个大约33个小时,真的太慢啦。。。。希望高手帮忙看看。
复制代码
请高手帮忙写个程式,,要复制144个文件夹内的某个时间段创建的文件,每个文件夹内有100到10000个不等的大小约300K的文件,希望不会运行过慢。在线等
[ 本帖最后由 iamstar 于 2009-10-11 18:52 编辑 ]
作者: netbenton 时间: 2009-10-9 13:17
本帖最后由 pcl_test 于 2016-7-24 19:54 编辑
用到变量延迟,for内就应该用到!号
速度慢可能与同一进程内多线网络防问有关:
for在读取文件列表,并取文件建立时间,已经建立了网络传输,这时再插入xcopy,肯定义慢了。。。
改成如下,用临时文件:-
- @echo off &setlocal enabledelayedexpansion
-
- set time1=
- set /p time1=起始时间(20090721)
- set time2=
- set /p time2=结束时间(20090723)
-
- md "C:\Documents and Settings\Administrator\桌面\p\%time2%"
-
- (for /r \\192.168.1.3\p\123 %%a in (*.*) do (
- set var=%%~ta
- set var=!var:~0,4!!var:~5,2!!var:~8,2!
- IF !VAR! GEQ !TIME1! IF !VAR! LEQ !TIME2! (echo %%a)
- ))>%temp%\%~n0.tmp
- rem 读取符合条件的文件
-
- for /f "tokens=*" %%a in (type "%temp%\%~n0.tmp") do (
- echo dir /ta
- xcopy "%%a" "C:\Documents and Settings\Administrator\桌面\p\%time2%"
- rem 复制,并显示状态,注意errorlevel 的%改成了!
- if !errorlevel! equ 0 (echo OK) else ( echo NG)
- )
-
- pause
复制代码
作者: iamstar 时间: 2009-10-9 18:00 标题: 验证中
想这类复制时间段内的文件是否还有其他的方法,,就以上两种方法吗。。
作者: iamstar 时间: 2009-10-10 11:53 标题: 回复 2楼 的帖子
(type "%temp%\%~n0.tmp") 是不是应该加一个单引号改为(‘type "%temp%\%~n0.tmp"’) 。。。
2楼发表的帖子 复制过程也很慢,,
但是在直接通过网络路径复制,不用批处理 速度很快 ,有原因吗??
求一速度快一些的复制时间的德程式程式
作者: Batcher 时间: 2009-10-10 13:17 标题: 回复 4楼 的帖子
先用net use映射网络驱动器,再试试这样速度是否有所改善。
作者: netbenton 时间: 2009-10-10 13:33
re 4楼
对,是我漏掉了单引号
这样也慢吗?
是慢在取文件的日期上吧,
xcopy 应该不慢了吧?
作者: iamstar 时间: 2009-10-10 18:41 标题: 回复 6楼 的帖子
都很慢,去文件的时间大约有4分钟左右无反应,取文件结束后再复制文件,大约30秒才复制完一个300K的文件,慢!!!。单纯通过网络拷贝复制很快。。。
望各位大大帮帮忙,想一想是否还有其他的复制时间段的程式。。。急用。。。
作者: iamstar 时间: 2009-10-14 11:58 标题: 批处理复制时间段内的文件并根究返回值判断是否OK
- @echo off
- set t=%time%
- :line
- set line=
- set /p line=请输入线别(01~10):
- if not "%line%" == "01" if not "%line%" == "02" if not "%line%" == "03" if not "%line%" == "04" if not "%line%" == "05" if not "%line%" == "06" if not "%line%" == "07" goto a
- if "%line%" == "Q" exit cmd
- echo 线别Y%line%
- :pcnum
- set pcnum=
- set /p pcnum=请输入电脑编号(1~6):
- if not "%pcnum%" == "1" if not "%pcnum%" == "2" if not "%pcnum%" == "3" if not "%pcnum%" == "4" if not "%pcnum%" == "5" if not "%pcnum%" == "6" goto b
- if "%pcnum%" == "Q" exit cmd
- echo 电脑编号%pcnum%
- set aa=
- set /a aa=2*%pcnum%-1
- set bb=
- set /a bb=2*%pcnum%
- rem 一个电脑编号对应两个设备编号
- :data
- set data=
- set /p data=请输入拷贝文件的月份(200907):
- echo 拷贝文件月份%data%
- :disk
- set disk=
- set /p disk=请输入复制后文件的盘符(C~E):
- if not "%disk%" == "C" if not "%disk%" == "d" if not "%disk%" == "e" goto c
- echo 盘符 %disk%
- title Y %line% L %pcnum%
- md %disk%:\WORK%data%\work%aa%
- md %disk%:\WORK%data%\work%bb%
- setlocal enabledelayedexpansion
- echo *********************%aa%*************************
- for /r \\Y%line%L%pcnum%\WORK%aa% %%a in (*.*) do (
- set var=%%~ta
- set var=!var:~0,4!!var:~5,2!
- IF !VAR! equ !data! xcopy "%%a" %disk%:\WORK%data%\work%aa%)
- if !errorlevel! equ 0 (echo OK) else (echo NG)
- echo ********************%bb%***********************
- for /r \\Y%line%L%pcnum%\WORK%bb% %%a in (*.*) do (
- set var=%%~ta
- set var=!var:~0,4!!var:~5,2!
- IF !VAR! equ !data! xcopy "%%a" %disk%:\WORK%data%\work%bb%)
- if !errorlevel! equ 0 (echo OK) else (echo NG)
- call :time0 "%t%" "%time%" "ok"
- echo.&echo 耗时: %ok%
- pause&exit
- :time0 以下为封装部分。
- :: code 随风 @bbs.bathone.cn 2008-08-15
- setlocal&set /a n=0
- for /f "tokens=1-8 delims=.: " %%a in ("%~1:%~2") do (
- set /a n+=10%%a%%100*360000+10%%b%%100*6000+10%%c%%100*100+10%%d%%100
- set /a n-=10%%e%%100*360000+10%%f%%100*6000+10%%g%%100*100+10%%h%%100
- )
- set "n=%n:-=%"
- set /a s=n/360000,n=n%%360000,f=n/6000,n=n%%6000,m=n/100,n=n%%100
- set "ok=%s% 小时 %f% 分钟 %m% 秒 %n% 毫秒"
- endlocal&set "%~3=%ok%"&goto :eof
- pause
-
- :a
- echo 输入错误 & goto line
- :b
- echo 输入错误 & goto pcnum
- :c
- echo 输入错误 & goto disk
复制代码
问题一 :
无论是否复制成功 ,都回显Ok ???希望复制OK就是OK,复制错误就是NG。
问题二:
以上例子我只是拷贝了两个文件夹 。假如我有work1到WORK144个文件夹,不会要写144个for语句来拷贝吧。希望有没有简洁一些的表示方法。。我这个程式过于繁琐 ,希望帮忙简化一些代码
问题三:
由于是联网拷贝,如果文件过多,将会导致执行程式 的速度过慢。假如有10000个文件在里面找200907的复制出来 ,速度会很慢很慢。。希望可以修改一下 ,提高命令的效率。
问题四:
这个程式是复制修改日期之间的文件,希望修改一个复制创建日期之间的文件的程式。。我在论坛看了一些关于创建日期的帖子都使用dir /tc 希望解释一下到底怎么应用。
我是一个刚接触批处理的新手。这几天在看论坛的帖子,写了这么一个批处理,发现了很多问题,希望大家指正一下。。
[ 本帖最后由 iamstar 于 2009-10-14 12:13 编辑 ]
作者: iamstar 时间: 2009-10-15 18:38 标题: 复制
有没有人帮忙看下修改下这个程式。。
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |