|
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 |
|