中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --

联盟域名:www.cn-dos.net  论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » 前些天看到一个关于文本内容的帖子(bat)
作者:
标题: 前些天看到一个关于文本内容的帖子(bat) 上一主题 | 下一主题
lililulula
中级用户





积分 302
发帖 138
注册 2007-3-29
状态 离线
『楼 主』:  前些天看到一个关于文本内容的帖子(bat)

前些天看到一个问题

  Quote:
下面是一个xml文档的内容的部分,难题是,如何根据其内容,然后从电脑中复制所有的Filename文件,并保存到每个文件所对应的ServerFolder路径中?
<UpdateFiles
        UpdateDate="21052007 0215">
        <FileDescription
                ComponentID="AVS"
                UpdateType="desc"
                ServerFolder="../../bases/av/avc/i386"
                Filename="av-i386-0607g.xml"
                FileDate="21052007 0057" />
        <FileDescription
                ComponentID="AS"
                UpdateType="desc"
                ServerFolder="../../bases/as/kis"
                Filename="as-0607g.xml"
                FileDate="21052007 0202" />
        <FileDescription
                ComponentID="AHI386"
                UpdateType="desc"
                ServerFolder="../../bases/ids/i386"
                Filename="ah-i386-0607g.xml"
                FileDate="18052007 1408" />
        <FileDescription
                ComponentID="AHX64"
                UpdateType="desc"
                ServerFolder="../../bases/ids/x64"
                Filename="ah-x64-0607g.xml"
                FileDate="18052007 1418" />
        <FileDescription
                ComponentID="AH"
                UpdateType="desc"
                ServerFolder="../../bases/ids/i386-x64"
                Filename="ah-i386-x64-0607g.xml"
                FileDate="18052007 1427" />

很难的一个题目。。希望高手能帮忙解决。。先谢过了!

说明一下。保存路径可以只是后面有显示的部分。如bases/av/avc/i386

当时有思路,但是这几天一下子忙忘了,今天又想起来,写了下测试成功,也算自己做个练习,代码如下,XP 下测试成功,达到提问者的要求.
不过有一点疑问就是我取了ServerFolder 和Filename的记录后,前面会有很多空格,所以我用!filefolder:~30,-1!取目录名,!filename:~26,-1!取文件名,个人猜想如果操作系统变化的话,可能取的位数也会发生变化,至于空格产生原因期待高人解释.
@echo off&setlocal enabledelayedexpansion
for /f "tokens=1* delims=:" %%i in ('findstr /n /c:"ServerFolder" D:\1.xml') do (
set filefolder=%%j
set filefolder=!filefolder:~30,-1!
for /f "tokens=1* delims=:" %%a in ('findstr /n /c:"Filename" D:\1.xml') do (
set filename=%%b
set filename=!filename:~26,-1!
set /a num=%%i+1
if %%a==!num! (copy !filename! "!filefolder!")
)
)
[ Last edited by lililulula on 2007-5-25 at 12:48 PM ]

2007-5-25 12:25
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
wudixin96
银牌会员





积分 1928
发帖 931
注册 2007-1-6
状态 离线
『第 2 楼』:  

这个应该用JS处理起来。效果会好些。

2007-5-25 14:04
查看资料  发短消息 网志   编辑帖子  回复  引用回复
bjsh
银牌会员





积分 2000
发帖 621
注册 2007-1-1
状态 离线
『第 3 楼』:  

我来把那天的整个问题陈述一下吧;
他那天描述的很不清楚:
后来私下找我;我了解到的;


附件里的有两个文件一个是 涉及到的资源文件 1文件夹; 一个是 目标文件夹 AVP;

最开始时AVP内只有这样一个目录结构  avp\index\6\a.xml

他的意思是根据a.xml里涉及到的"filename="所涉及到的文件全部复制到所对应的"serverfolder"文件夹里;
这些serverfolder的根目录就是avp; 其中有写filename没有对应的serverfolder就复制到当前被操作的xml同一目录下;

a.xml操作完后 在avp下产生两个文件夹; 然后对avp内所有的xml除了a.xml 都进行上述相同的操作;


实际写的时候遇到的问题是: xml的书写并不一致,有写serverfolder在filename前面有写 在后面;

尤其是除了a.xml外其他的xml更是涉及到了大量的 只有filename没有serverfolder的问题;

我把我的代码贴出来
@echo off & setlocal enabledelayedexpansion
call :reset
for /f "tokens=2 delims== " %%a in ('findstr /i "serverfolder filename" c:\avp\index\6\a.xml') do (
        if not defined serverfolder (set "serverfolder=%%~a") else (
                       if not defined filename set "filename=%%~a" & call :start1
        )
)

move c:\AVP\index\6\a.xml c:\

for /f %%l in ('dir /b /s c:\AVP\*.xml') do (
        call :reset
        for /f "tokens=1,2 delims== " %%a in ('findstr /i "serverfolder filename" %%l') do (
                set "var=%%a"
                if "!count!"=="1" if /i "!var:~-8!"=="filename" copy c:\1\!filename! %%~dpl & set "count="
                 if /i "!var:~-8!"=="filename" set "filename=%%~b" & set /a count=1
                if /i "!var:~-12!"=="serverfolder"  set "serverfolder=%%~b"
                if defined serverfolder if defined filename call :start
        )
        if defined filename copy c:\1\!filename! %%~dpl
)
move c:\a.xml c:\AVP\index\6\
copy c:\1\xml-0607g.pbv c:\avp\index\6\
copy c:\1\kl-0607g.pbv c:\avp\index\6\
rd /s /q c:\avp\7g.pbv
pause & goto :eof
:start1
set "serverfolder=%serverfolder:~6%"
:start
set "serverfolder=%serverfolder:/=\%"
md c:\AVP\%serverfolder%
copy c:\1\%filename% c:\AVP\%serverfolder%
:reset
set "serverfolder="
set "filename="
set "count="


   此帖被 +2 点积分    点击查看详情   
评分人:【 nbic 分数: +2  时间:2007-5-25 18:00


附件 1: 1.rar (2007-5-25 17:01, 53.22 K, 下载附件所需积分 1 点 ,下载次数: 9)
2007-5-25 17:00
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
nbic
初级用户




积分 135
发帖 61
注册 2007-4-14
状态 离线
『第 4 楼』:  

这个问题。在bjsh版主的帮助下。已经得到解决。。
由于权限不够。。只能加最多的分。。

不过这个问题的解决,帮了我一个很大的忙,非常感谢!

[ Last edited by nbic on 2007-5-25 at 06:02 PM ]

2007-5-25 17:18
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
lililulula
中级用户





积分 302
发帖 138
注册 2007-3-29
状态 离线
『第 5 楼』:  

恩,如果按bjsh版主所说的serverfolder和filename xml里顺序不同的话,我这个批无法实现,还有就是如果没列出serverfolder的话,复制到当前avp目录这个我由于不知道原因所以批也无能为力了,bjsh斑竹热心人,谢谢提醒

2007-5-25 17:51
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
nbic
初级用户




积分 135
发帖 61
注册 2007-4-14
状态 离线
『第 6 楼』:  

现在有个问题。。就是如何将
:start
set "serverfolder=%serverfolder:/=\%"
md c:\AVP\%serverfolder%
copy c:\1\%filename% c:\AVP\%serverfolder%
中的copy的过程屏蔽掉。让它不在cmd界面中显示。。
我试着copy c:\1\%filename% c:\AVP\%serverfolder% >nul 2>nul,不能屏蔽。。

2007-5-26 10:45
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
bjsh
银牌会员





积分 2000
发帖 621
注册 2007-1-1
状态 离线
『第 7 楼』:  

可以屏蔽啊
c:\>copy 9999.txt 89
已复制         1 个文件。

c:\>echo y|del 89\*.*
c:\89\*.*, 是否确认(Y/N)? y

c:\>copy 9999.txt 89 >nul 2>nul

c:\>

2007-5-26 12:24
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
nbic
初级用户




积分 135
发帖 61
注册 2007-4-14
状态 离线
『第 8 楼』:  

那么在执行上面3楼的整个程序时,cmd屏幕会显示:复制了一个文件
等的信息。这个问题出在哪呢?

2007-5-26 13:06
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
bjsh
银牌会员





积分 2000
发帖 621
注册 2007-1-1
状态 离线
『第 9 楼』:  

把所有涉及到 copy 和move 的地方都加上 >nul 2>nul

不仅仅只有:start里面有复制;

好好看看代码

2007-5-26 14:07
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
nbic
初级用户




积分 135
发帖 61
注册 2007-4-14
状态 离线
『第 10 楼』:  

还是不行。。
move c:\AVP\index\6\a.xml c:\
if "!count!"=="1" if /i "!var:~-8!"=="filename" copy c:\1\!filename! %%~dpl & set "count="
if defined filename copy c:\1\!filename! %%~dpl
move c:\a.xml c:\AVP\index\6\
copy c:\1\xml-0607g.pbv c:\avp\index\6\
copy c:\1\kl-0607g.pbv c:\avp\index\6\
copy c:\1\%filename% c:\AVP\%serverfolder%
这些后面都加了>nul 2>nul还是会显示哦。。

2007-5-26 16:22
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
nbic
初级用户




积分 135
发帖 61
注册 2007-4-14
状态 离线
『第 11 楼』:  



  Quote:
Originally posted by bjsh at 2007-5-26 12:24 PM:
可以屏蔽啊
c:\>copy 9999.txt 89
已复制         1 个文件。

c:\>echo y|del 89\*.*
c:\89\*.*, 是否确认(Y/N)? y

c:\>copy 9999.txt 89 >nul 2>nul

c:\>

我想要的是。将“已复制         1 个文件。”这种文字信息屏蔽掉。。
不过试了很多。都不能达到效果哦。。

2007-5-26 18:00
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
bjsh
银牌会员





积分 2000
发帖 621
注册 2007-1-1
状态 离线
『第 12 楼』:  

if "!count!"=="1" if /i "!var:~-8!"=="filename" copy c:\1\!filename! %%~dpl & set "count="


这句不是把 >nul 2>nul 直接加在后面 而是加在

if "!count!"=="1" if /i "!var:~-8!"=="filename" copy c:\1\!filename! %%~dpl >null 2>nul& set "count="

   此帖被 +2 点积分    点击查看详情   
评分人:【 nbic 分数: +2  时间:2007-5-26 23:18


2007-5-26 20:39
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复

请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题



论坛跳转: