Board logo

标题: [文件操作] 批处理如何实现筛选、移动、写文件 [打印本页]

作者: 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实现吧:
  1. Dim SHELL, Path, Html
  2. Set SHELL = CreateObject("Wscript.Shell")
  3. Path = SHELL.CurrentDirectory
  4. Set SHELL = Nothing
  5. Do
  6.   MoveFile Path
  7.   WScript.Sleep 10000 '此为延迟10秒,请自行修改
  8. Loop
  9. Function MoveFile(Path)
  10.   Dim FSO, SHELL, vbStr, File, Y, M, D, Str, arr
  11.   vbStr = "<?xml version=""1.0"" encoding=""gbk"" ?>" & vbCrLf _
  12.     & "<files>" & vbCrLf _
  13.     & "@$#&" & vbCrLf _
  14.     & "</files>"
  15.   Set FSO = CreateObject("Scripting.FileSystemObject")
  16.   Html = ""
  17.   If FSO.FileExists("List.xml") Then
  18.     arr = Split(FSO.OpenTextFile("List.xml").ReadAll(), vbCrLf)
  19.     For Each Str In arr
  20.       If InStr(Str, "<file year=") Then Html = Html & Str & vbCrLf
  21.     Next
  22.   End If
  23.   Str = ""
  24.   For Each File In FSO.GetFolder(Path).Files
  25.     If File.Name <> "List.xml" Then
  26.       If LCase(FSO.GetExtensionName(File)) = "xml" Then
  27.         Y = Year(Mid(File.Name, 1, 8))
  28.         M = Month(Mid(File.Name, 1, 8))
  29.         D = day(Mid(File.Name, 1, 8))
  30.         Str = Str & "<file year=""" & Y & """month=""" & M & """day=""" & D & """name=""XXXX"" url=""服务器路径/A/" & File & """ />" & vbCrLf
  31.         FSO.OpenTextFile("List.xml", 2, True).Write vbStr
  32.         FSO.MoveFile File, Path & "\A\"
  33.       End If
  34.     End If
  35.   Next
  36.   vbStr = Replace(vbStr, "@$#&", Str & Html)
  37.   Set FSO = Nothing
  38. End Function
复制代码

作者: Demon    时间: 2011-6-30 12:08

批处理真是无所不能啊
作者: tmplinshi    时间: 2011-6-30 12:37

本帖最后由 tmplinshi 于 2011-6-30 14:53 编辑
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. rem 注意:文件名、路径、文件内容中不能含有半角感叹号
  4. rem ------------------- 设置 -------------------
  5. set "SrcFolder=D:\目录"
  6. set "log=D:\目录\log\log.xml"
  7. set "DestFolder=A"
  8. rem --------------------------------------
  9. md "%SrcFolder%" 2>nul
  10. cd /d "%SrcFolder%"
  11. md "%DestFolder%" 2>nul
  12. for %%a in ("%log%") do md "%%~dpa" 2>nul
  13. del .tmp 2>nul
  14. set _ExistHead=
  15. rem ------------------- 提取符合条件的文件 -------------------
  16. for %%a in (*.xml) do (
  17.     set fname=%%a
  18.     rem 判断一:文件名字符数要大于 21 位
  19.     if "!fname:~21!" neq "" (
  20.         rem 判断二:前 12 位必须是数字
  21.         for /f "tokens=* delims=0123456789" %%a in ("!fname:~0,12!") do (
  22.             if "%%a" == "" (
  23.                 rem 判断三:17 位后面的字符必须大于 Z,基本上意味着是中文
  24.                 if "!fname:~17!" gtr "Z" (
  25.                     call :next >>.tmp
  26. )))))
  27. if not exist .tmp exit /b
  28. rem ------------------- 完成 -------------------
  29. move .tmp "%log%"
  30. >>"%log%" echo ^</files^>
  31. exit /b
  32. rem ------------------- 写入 xml,及移动文件 -------------------
  33. :next
  34. rem 设置年、月、日变量,并去除月、日开头的 0
  35. set /a yyyy = %fname:~0,4%, m = 1%fname:~4,2% - 100, d = 1%fname:~6,2% - 100
  36. rem 把 %log% 文件中非“</files>”的行输出到 .tmp
  37. if not defined _ExistHead (
  38.     if not exist "%log%" (
  39.         rem 不存在 %log% 文件,则创建 %log% 文件头
  40.         echo ^<?xml version="1.0" encoding="gbk" ?^>
  41.         echo ^<files^>
  42.     ) else (
  43.         rem 不输出 log 中的“</files>”
  44.         findstr /v "\<</" "%log%"
  45.     )
  46.     set _ExistHead=#
  47. )
  48. echo ^<file year="%yyyy%" month="%m%" day="%d%" name="XXXX" url="服务器路径/A/%fname%" /^>
  49. move "%fname%" "%DestFolder%"
  50. 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://www.bathome.net/) Powered by Discuz! 7.2