标题: 一个我认为很难的问题求助(更新)
[打印本页]
作者: fzp1978321
时间: 2008-1-18 20:09
标题: 一个我认为很难的问题求助(更新)
在JHSJ目录内,有如下格式的文件:YHZJLS_20080102.TXT
YHZDBP_20080102.TXT
VIP11.TMP
5_1000.102
2_1000.102
2_1000.C28
3_1000.C05
4_1000.B06
...........
同时,在JHSJ目录内,有名称为1002,1004,1005...的子目录,而又在这些子目录内.又分别有RECV和SEND两个子目录.
在RECV目录中的文件格式如下:2_1000.102
2_1000.727
2_1000.A26
2_1000.B01
ACCRO0809
JGZJMX0809
KXXX0728.TXT
OBINFO0819
...............
在SEND目录里,都是YHZJLS_20080102.TXT这样的TXT文件.
要达到的要求:
1.每日生成为一个以当日日期的文件夹,如今天是2008年1月14日,则需 要生成一个20080114的文件夹.
2.在当日生成的文件夹内,按照JHSJ原有的目录样式分别将当日生成的数据 进行拷贝.
如,在20080114目录下,拷贝当日生成的文件,并且建立1002 文件夹,在1002文件夹内建立RECV和SEND两个子文件夹, 并分 别将这两个文件夹内当日的数据拷贝在各自文件夹内.
3.在下一周,即2008年1月21日拷贝当日数据时,将上一周JHSJ内的 数据清除,前提是保持JHSJ目录结构不变,只删文件,而不删文件夹.
4.此批处理要做成WIN2000下的计划任务定时执行,所以就必须写死.J HSJ文件夹结构是固定的,不会变化.
这个问题我想了快半个月了,基本把自己给绕死了,呵呵,所以就在这向大家求助了.由于对DOS批处理不熟悉,所以也请各位海涵,尽量说得浅显点吧!
另:感谢版主LXMXN和ZJHJ的指点,给了我些帮助,但是在下实在很 菜,至今还未完全理解.尤其是ZJHJ提供的代码.不过很谢谢你们的热 心!
比较晕,无法将JHSJ的压缩文件发上来.
那先贴我自己写的一段吧:
@echo off
::当前日期,格式:yyyymmdd
set today=%date:~0,4%-%date:~5,2%-%date:~8,2%
echo %today%
set src="D:\jhsj"
dir %src%\/o/b/-p>filename.txt
dir %src%\/ad/-p/b/o>dir.txt
for /f "delims=\n" %%j in (filename.txt) do (
for /f "tokens=1" %%a in ('dir /tc %%j^|findstr "^....-..-..\>"') do (
if "%%a"=="%today%" (copy %%j c:\temp\)
)
)
pause
::写到这,我就完全卡住了,而且好象还没写对。哎,恼火!
望高手相助!
[
Last edited by fzp1978321 on 2008-1-20 at 01:33 AM ]
作者: fzp1978321
时间: 2008-1-18 20:14
YHZJLS_20080102.TXT
YHZDBP_20080102.TXT
VIP11.TMP
5_1000.102
2_1000.102
关键是像这样的同一天生成的文件该如何拷贝出来?尤其是VIP11.TMP这样的TMP文件,只能看得到属性里的生成时间,而文件本身反映不出时间.
这是卡住我的第一个难题.
另:我的系统是WIN2000的.
[
Last edited by fzp1978321 on 2008-1-18 at 08:17 PM ]
作者: fennng
时间: 2008-1-18 20:41
题目比较难看明白...
作者: fzp1978321
时间: 2008-1-18 21:15
那我就把问题拆开问吧,这样可能会简单点
首先,对于当日生成的不同类型文件,应该如何拷贝?
见例:
YHZJLS_20080102.TXT
YHZDBP_20080102.TXT
VIP11.TMP
5_1000.102
2_1000.102
(这几个文件都是2008-1-2日生成的文件,只拷贝当日生成的文件,前一日或者更早的文件不拷贝))
[
Last edited by fzp1978321 on 2008-1-18 at 09:17 PM ]
作者: lxmxn
时间: 2008-1-18 21:57
可以用dir命令的“/tc”参数来取得文件的创建时间,再根据时间来进行相应的备份和删除操作即可。
作者: fzp1978321
时间: 2008-1-18 22:04
能说下这命令是怎么写的么?我原来也是这么想的,但是就是不知道该怎么去从生成时间来获取文件.
强盼!~
作者: lxmxn
时间: 2008-1-18 22:14
举个简单的例子。
例如获取“C:\windows\explorer.exe”文件的创建时间,并且判断它是不是2007-12-25号创建的,如果是,显示“YES”,否则显示“NO”。
@echo off
for /f "tokens=1" %%a in ('dir /tc C:\Windows\Explorer.exe^|findstr "^....-..-..\>"') do (if "%%a"=="2007-12-25" (echo YES) else echo NO)
pause
作者: fzp1978321
时间: 2008-1-19 00:42
好象不对啊,我用你给的这命令,稍微改了下路径,去遍历某个文件夹里的文件,但是全部显示是"NO",可里边有的文件是有2007-12-25那天创建的啊.
[
Last edited by fzp1978321 on 2008-1-19 at 12:43 AM ]
作者: everest79
时间: 2008-1-19 01:54
rar可以完成这个工作
作者: ZJHJ
时间: 2008-1-19 20:31
发个自定义搜索给你,这是我写在系统维护V1.8里的一个功能,你自己修改吧。已经把路径都搜出来了,至于备份和删除,我想也不会难的。
@echo off
@cls
@echo.
@echo 自定义搜索各分区的任意文件,默认所有时间,所有扩展,按创建时间记录。
@echo.
@echo 如果在这些日期没有安装软件,则不会有 exe、dll、inf 文件创建在机器中,
@echo.
@echo 检查创建日期,可以发现近期哪些文件是新注入的,是否病毒所为。
@echo.
@echo.
@echo 全盘搜索指定日期(格式:2007-09-29)创建生成的文件
@echo.
set /p sczf= 输入(T 退出)搜索指定生成日期(默认所有日期):
IF "%sczf%" == "T" GOTO KK
@echo.
@set /p YGJ= 输入要搜索的文件名或扩展名(默认所有扩展: *.*):
@echo 按创建时间(排序)生成的%YGJ%文件(如果需要请另存): >%sczf%生成文件.txt
@echo.>>%sczf%生成文件.txt
::检查有效盘符
cd.>yxpf.txt
cd.>pf.txt
for %%f in (C D E F G H I J K L M N O P Q R) do if exist %%f:\ @echo %%f>>pf.txt
for /f "tokens=*" %%i in (pf.txt) do set /p "mn=%%i "<nul>>yxpf.txt
for /f "delims=" %%i in (yxpf.txt) do set pf=%%i
del pf.txt
del yxpf.txt
@echo 测试系统环境>sw.wer
dir *.wer /a-d /t:w /s>vv.txt
findstr /i "wer" vv.txt>sw.txt
type sw.txt | findstr /i /r "上午"
if %errorlevel%==0 goto JYSW
del sw.wer
del vv.txt
del sw.txt
::不存在“上午”
set xgbl=%%k %%l
set zjdx=3
set zjjc=3
set fdms=%%i%%j%%k%%l
cls
goto JKSJC
:JYSW
del sw.wer
del vv.txt
del sw.txt
::存在“上午”
set xgbl=%%l
set zjdx=3
set zjjc=4
set fdms=%%i%%j%%k%%l
cls
:JKSJC
setlocal enabledelayedexpansion
@echo.
@echo 正在按创建时间+完整路径搜索*%YGJ%文件,请稍候...!
@echo.
@echo 如果需要,请另存>path.txt
for %%f in (%pf%) do (
for /f "tokens=1-%zjdx%*" %%i in (
'dir %%f:\*"%YGJ%"*.* /a-d /t:c /s ^|findstr ":"'
) do (
set syqf=%fdms%
if "!syqf:~1,1!"==":" set sjl=!syqf!
if not "!sjl!"=="!syqf!" if not "%%j"=="" echo %%i %%j !sjl:~0,-3!\%xgbl%>>path.txt
)
)
call path.txt
::时间排序
sort<path.txt>px.txt
findstr /R "\<%sczf%\>" px.txt>> %sczf%生成文件.txt
del path.txt
del px.txt
call %sczf%生成文件.txt
del 生成文件.txt
del %sczf%生成文件.txt
作者: fzp1978321
时间: 2008-1-20 01:32
谢谢楼上的兄弟!
作者: fzp1978321
时间: 2008-1-20 02:33
哎,急死了,后半夜了,脑袋都写成糨糊了.
作者: everest79
时间: 2008-1-20 03:20
在你的winrar安装目录下有个命令rar.exe你可以拷贝到C:\windows\system32下
然后执行这样的命令行
rar a -agYYYYMMDD -tn1D D:\bak\ D:\jhsj
会在D:\bak下生成一个以当前日期为名的压缩文件,里边包括了D:\jhsj目录下不超过24小内的工作文件
作者: fzp1978321
时间: 2008-1-20 13:56
谢谢楼上的解答.
但是这样也没有解决问题啊.比如一周后JHSJ内数据的删除又该如何解决呢?
作者: everest79
时间: 2008-1-20 16:38
判断date是否为周一再执行
del /s /q /f D:\jhsj就可以了
作者: terse
时间: 2008-1-20 16:57
不知道对你有用不 至于删文件 应该一样判断
@echo off
set Files=%date:~0,4%%date:~5,2%%date:~8,2%
if not exist %Files%\ md %Files%
for /r jhsj %%i in (*.*) do set t=%%~ti &set p=%%~pi&call :loop "%%~fi"
pause
goto :eof
:loop
set p=%p:~5%
echo %p%
if "%Files%"=="%t:~0,4%%t:~5,2%%t:~8,2%" xcopy %~1 %Files%%p% /Y /H /R
作者: fzp1978321
时间: 2008-1-20 22:41
Quote: |
Originally posted by everest79 at 2008-1-20 04:38 PM:
判断date是否为周一再执行
del /s /q /f D:\jhsj就可以了 |
|
是直接加在rar a -agYYYYMMDD -tn1D f:\bak\ 后面么?
还是另外再建个批处理,然后添加到任务计划中?
[
Last edited by fzp1978321 on 2008-1-20 at 10:45 PM ]
作者: everest79
时间: 2008-1-21 01:15
rar -a -agYYYYMMDD -tn1D F:\bak\ D:\jhsj
if not date goto :eof
del /s /q /f D:\jhsj
作者: fzp1978321
时间: 2008-1-21 01:19
rar -a -agYYYYMMDD -tn1D F:\bak\ D:\jhsj
这句能正确执行,
但是执行if not date goto :eof
del /s /q /f D:\jhsj
就出错了,一闪而过.
如果是
rar -a -agYYYYMMDD -tn1D F:\bak\ D:\jhsj
if not date goto :eof
del /s /q /f D:\jhsj
执行,就全部出错,没有任何反应.
作者: everest79
时间: 2008-1-21 01:29
if not date 这句是样例,因为我不知道2k下的date输出格式是怎么样的
像在xp下判断是否为周一是这样的
if not "%date:~-1%" == "一" goto :eof
del /s /q /f D:\jhsj
echo %date% 显示为 2008-01-21 星期一
echo %date:~-1% 显示为 一
作者: terse
时间: 2008-1-21 01:35
删除7天前文件(日期判断不是很准 因为有特殊日) COPY当天文件到当天文件夹 不知道是这样的要求否?
@echo off
set Files=%date:~0,4%%date:~5,2%%date:~8,2%
if not exist %Files%\ md %Files%
set p1=%Files:~0,4%
set p2=%Files:~4,2%
set p3=%Files:~6,2%
setlocal enabledelayedexpansion
for /l %%a in (1,1,3) do (
for /f "delims=0 tokens=*" %%i in ("!p%%a!") do set p%%a=%%i
)
call :loop1
set p2=0%t2%
set p2=%p2:~-2,2%
set p3=0%t3%
set p3=%p3:~-2,2%
for /r jhsj %%i in (*.*) do set t=%%~ti &set p=%%~pi&call :loop2 "%%~fi"
pause
goto :eof
:loop1
if %p3% lss 7 (
if %p2% EQU 1 set t2=12&set/a p1-=1&set/a t3=%p3%+24&goto :eof
if %p2% EQU 3 set/a t3=%p3%+21&set/a t2=%p2%-1&goto :eof
for %%p in (5 7 10 12) do if %p2% EQU %%p set/a t3=%p3%+23&set/a t2=%p2%-1&goto :eof
set/a t2=%p2%-1&set/a t3=%p3%+24&goto :eof
)
set t2=%p2%&set/a t3=%p3%-7&goto :eof
:loop2
set p=%p:~5%
if "%Files%"=="%t:~0,4%%t:~5,2%%t:~8,2%" xcopy %1 %Files%%p% /Y /H /R >nul
if %t:~0,4%%t:~5,2%%t:~8,2% LEQ %p1%%p2%%p3% del %1
goto :eof
作者: fzp1978321
时间: 2008-1-21 01:40
噢,我明白了
那我把if not date,中的date,在WIN 下改成"%date:~*%"== "一" goto :eof
(*)是代表在WIN2000下的DATE输出格式.
如果正确的写出*该代表的值,那就OK了,是吧?
EVEREST79你真的很牛,我简直都要对你进行膜拜了!
作者: fzp1978321
时间: 2008-1-21 01:43
Quote: |
Originally posted by terse at 2008-1-21 01:35 AM:
删除7天前文件(日期判断不是很准 因为有特殊日) COPY当天文件到当天文件夹 不知道是这样的要求否?
[code]
@echo off
set Files=%date:~0,4%%date:~5,2%%date:~8,2 ... |
|
恩,是这样的要求.很感谢你的热心,让我又学到不少技巧!
作者: fzp1978321
时间: 2008-1-21 01:59
EVEREST79,你能解释下 rar -a -agYYYYMMDD -tn1D F:\bak\ D:\jhsj这语句中 rar -a -agYYYYMMDD -tn1D的意思么?事情虽然做成了,但是对这条语句,我还没懂起,麻烦赐教!
作者: fzp1978321
时间: 2008-1-21 02:08
-tn1D这个我没看明白,不懂
作者: fzp1978321
时间: 2008-1-21 12:33
问题又来了.在WIN2000下
echo
rar -a -agYYYYMMDD -tn1D F:\bak\ D:\jhsj
if not "%date:~2,1%" == "一" goto :eof
del /s /q /f D:\jhsj
执行,结果,备份和压缩文件正确,但是往下继续执行if not "%date:~2,1%" == "一" goto :eof就没执行了,一闪而过.
"%date:~2,1%"的显示为"一"(WIN 2000下)
这是为什么啊,应该是对了的啊
作者: fzp1978321
时间: 2008-1-21 14:31
everest79,请问一下,如果我把文件夹JHSJ名换成中文"建户数据",就提取不了文件夹名了而且数据提取不进行了,应该如何去识别中文的文件夹名呢?
rar a -agYYYYMMDD -tn1D D:\bak\ D:\建户数据
如果这样写,就会出错,是为什么啊?