标题: [文件操作] 批处理如何实现筛选、移动、写文件 [打印本页]
作者: meteormiao 时间: 2011-6-30 08:57 标题: 批处理如何实现筛选、移动、写文件
本帖最后由 meteormiao 于 2011-7-5 14:54 编辑
问题描述:
一个目录下有若干xml文件,但都是以字母作为文件名。
不定时会传输过来一个如下命名格式的xml文件:yyyymmddhhmm(年月日时分)xxxxx(5位不定代码)xxxxxx(若干中文字).xml
我想用计划任务,定期执行批处理,一旦检索到有以该方式命名的文件,就写入一个xml文件,同时将该文件移动到同目录下A文件夹中(不需要进行改名处理),写入的xml格式如下:
<?xml version="1.0" encoding="gbk" ?>
<files>
<file year="2011" month="4" day="7" name="XXXX" url="服务器路径/A/yyyymmddhhmm(年月日时分)xxxxx(5位不定代码)xxxxxx(若干中文字).xml
" />
</files>
每来一个新文件,就在这个xml中写入一条,最新的在最上面。
其中的year,month,day为从文件命中的时间读取获得
name为固定文字
请问这个批处理如何实现呢,谢谢了~~
作者: batman 时间: 2011-6-30 11:35
批不适合循环监控,还是用vbs实现吧:- Dim SHELL, Path, Html
- Set SHELL = CreateObject("Wscript.Shell")
- Path = SHELL.CurrentDirectory
- Set SHELL = Nothing
- Do
- MoveFile Path
- WScript.Sleep 10000 '此为延迟10秒,请自行修改
- Loop
-
- Function MoveFile(Path)
- Dim FSO, SHELL, vbStr, File, Y, M, D, Str, arr
- vbStr = "<?xml version=""1.0"" encoding=""gbk"" ?>" & vbCrLf _
- & "<files>" & vbCrLf _
- & "@$#&" & vbCrLf _
- & "</files>"
- Set FSO = CreateObject("Scripting.FileSystemObject")
- Html = ""
- If FSO.FileExists("List.xml") Then
- arr = Split(FSO.OpenTextFile("List.xml").ReadAll(), vbCrLf)
- For Each Str In arr
- If InStr(Str, "<file year=") Then Html = Html & Str & vbCrLf
- Next
- End If
- Str = ""
- For Each File In FSO.GetFolder(Path).Files
- If File.Name <> "List.xml" Then
- If LCase(FSO.GetExtensionName(File)) = "xml" Then
- Y = Year(Mid(File.Name, 1, 8))
- M = Month(Mid(File.Name, 1, 8))
- D = day(Mid(File.Name, 1, 8))
- Str = Str & "<file year=""" & Y & """month=""" & M & """day=""" & D & """name=""XXXX"" url=""服务器路径/A/" & File & """ />" & vbCrLf
- FSO.OpenTextFile("List.xml", 2, True).Write vbStr
- FSO.MoveFile File, Path & "\A\"
- End If
- End If
- Next
- vbStr = Replace(vbStr, "@$#&", Str & Html)
- Set FSO = Nothing
- End Function
复制代码
作者: Demon 时间: 2011-6-30 12:08
批处理真是无所不能啊
作者: tmplinshi 时间: 2011-6-30 12:37
本帖最后由 tmplinshi 于 2011-6-30 14:53 编辑
- @echo off
- setlocal enabledelayedexpansion
-
- rem 注意:文件名、路径、文件内容中不能含有半角感叹号
-
- rem ------------------- 设置 -------------------
- set "SrcFolder=D:\目录"
- set "log=D:\目录\log\log.xml"
- set "DestFolder=A"
-
- rem --------------------------------------
- md "%SrcFolder%" 2>nul
- cd /d "%SrcFolder%"
- md "%DestFolder%" 2>nul
- for %%a in ("%log%") do md "%%~dpa" 2>nul
- del .tmp 2>nul
- set _ExistHead=
-
- rem ------------------- 提取符合条件的文件 -------------------
- for %%a in (*.xml) do (
- set fname=%%a
- rem 判断一:文件名字符数要大于 21 位
- if "!fname:~21!" neq "" (
- rem 判断二:前 12 位必须是数字
- for /f "tokens=* delims=0123456789" %%a in ("!fname:~0,12!") do (
- if "%%a" == "" (
- rem 判断三:17 位后面的字符必须大于 Z,基本上意味着是中文
- if "!fname:~17!" gtr "Z" (
- call :next >>.tmp
- )))))
-
- if not exist .tmp exit /b
-
- rem ------------------- 完成 -------------------
- move .tmp "%log%"
- >>"%log%" echo ^</files^>
- exit /b
-
- rem ------------------- 写入 xml,及移动文件 -------------------
- :next
- rem 设置年、月、日变量,并去除月、日开头的 0
- set /a yyyy = %fname:~0,4%, m = 1%fname:~4,2% - 100, d = 1%fname:~6,2% - 100
-
- rem 把 %log% 文件中非“</files>”的行输出到 .tmp
- if not defined _ExistHead (
- if not exist "%log%" (
- rem 不存在 %log% 文件,则创建 %log% 文件头
- echo ^<?xml version="1.0" encoding="gbk" ?^>
- echo ^<files^>
- ) else (
- rem 不输出 log 中的“</files>”
- findstr /v "\<</" "%log%"
- )
- set _ExistHead=#
- )
-
- echo ^<file year="%yyyy%" month="%m%" day="%d%" name="XXXX" url="服务器路径/A/%fname%" /^>
-
- move "%fname%" "%DestFolder%"
-
- goto :eof
复制代码
作者: CrLf 时间: 2011-6-30 13:14
3# Demon
要不要比较一下用各种语言实现移动文件的代码长度?只能说各有优缺点,批处理是有它的不足,但是日常使用的时候,它是最便捷的选择之一
楼主的问题,robocopy 可能可以帮得上忙,不过如果系统中没有这个命令,需要自行下载
作者: meteormiao 时间: 2011-6-30 14:39
感谢三位版主的精彩解答,受益匪浅啊~~~
作者: meteormiao 时间: 2011-7-4 14:35
这个问题帖里有两个小问题还想请教一下
1.每新写一条,下面总显示“已移动一个文件”,但我对move .tmp "%log%"
>>"%log%" echo ^</files^>
这里做修改后,批处理又无法运行了。请问如何去掉每次输入新写入后显示“已一定一个新文件呢?
2.每新写入一条信息,需要倒序排列,就是新写入的需要显示在最上面。
谢谢解答
作者: batman 时间: 2011-7-4 15:03
楼主试了二楼的vbs不?
作者: meteormiao 时间: 2011-7-4 16:11
实在汗颜,batman版主,你写的我没太看懂,里面定义了函数movefile,这个写成一个vbs,然后用批处理调用是吗
作者: meteormiao 时间: 2011-7-5 08:18
这个尝试着改了几次都不行啊
作者: batman 时间: 2011-7-5 08:28
还要调用做什么,直接运行不行?
作者: cjiabing 时间: 2011-7-5 10:12
文件操作相对来说批处理还是能够轻松应付的,但监控的话是个大问题,主要是效率的问题。
写这些程序的时候,最好是划分功能目标,然后分个去完成。
作者: meteormiao 时间: 2011-7-5 11:01
一运行就提示”加载设置失败,拒绝访问“
c:/windows/system32/wscript也有。。。。这个是什么原因呢
作者: CrLf 时间: 2011-7-5 11:16
13# meteormiao
是2楼的代码吗?可否试一试空的 test.vbs 能否正常运行
如果 vbs 用不了,就用4楼的纯批方案吧
作者: meteormiao 时间: 2011-7-5 14:41
空的TEST.VBS也不能正常运行,非常莫名。。。。。
我用4楼的纯批,就遇到下面这两个问题。。。。
1.每新写一条,下面总显示“已移动一个文件”,但我对move .tmp "%log%"
>>"%log%" echo ^</files^>
这里做修改后,批处理又无法运行了。请问如何去掉每次输入新写入后显示“已一定一个新文件呢?
2.每新写入一条信息,需要倒序排列,就是新写入的需要显示在最上面。
请问如何解决呢。。。。
作者: meteormiao 时间: 2011-7-6 08:13
郁闷死了啊啊啊啊啊啊啊啊啊啊
作者: meteormiao 时间: 2011-7-6 11:17
求助啊~~~~~~~
欢迎光临 批处理之家 (http://bbs.bathome.net/) |
Powered by Discuz! 7.2 |