中国DOS联盟论坛

中国DOS联盟

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

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

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » 如何截取文件名字和路经并相应拷贝?
作者:
标题: 如何截取文件名字和路经并相应拷贝? 上一主题 | 下一主题
feiying001
初级用户





积分 25
发帖 18
注册 2007-2-6
状态 离线
『楼 主』:  如何截取文件名字和路经并相应拷贝?

在这个文件中,如何截取Filename="pas4.stt"中的pas4.stt并拷贝到LocalPath="%BaseFolder%\Stat"中?注意是截取所有Filename=*并拷贝到相应的文件夹:LocalPath="%BaseFolder%\Stat",文件名字和路经并不完全相同,要根据内容进行提取


<UpdateFiles
        UpdateDate="27122009 0036"
        ObjectType="2=PAS4;3=BASE">
        <FileDescription
                ComponentID="PAS4"
                UpdateType="base"
                LocalPath="%BaseFolder%\Stat"
                Filename="pas4.stt"
                Body="OTk4MDY7MjAwOTEyMjcwMDM2DQo=" />
        <FileDescription
                ComponentID="PAS4"
                UpdateType="base"
                LocalPath="%BaseFolder%"
                Filename="base.keb" />
        <FileDescription
                ComponentID="PAS4"
                UpdateType="base"
                LocalPath="%BaseFolder%"
                Filename="content_interpreter.kep" />
        <FileDescription
                ComponentID="PAS4"
                UpdateType="base"
                LocalPath="%BaseFolder%"
                Filename="data.check.keb" />
        <FileDescription
                ComponentID="PAS4"
                UpdateType="base"
                LocalPath="%BaseFolder%"
                Filename="data.set.idn.keb" />
        <FileDescription
                ComponentID="PAS4"
                UpdateType="base"
                LocalPath="%BaseFolder%"
                Filename="data.set.keb" />
        <FileDescription
                ComponentID="PAS4"
                UpdateType="base"
                LocalPath="%BaseFolder%"
                Filename="database.kep" />
        <FileDescription
                ComponentID="PAS4"
                UpdateType="base"
                LocalPath="%BaseFolder%"
                Filename="dnsblacklists.keb" />
        <FileDescription
                ComponentID="PAS4"
                UpdateType="base"
                LocalPath="%BaseFolder%"
                Filename="filtration.kep" />
        <FileDescription
                ComponentID="PAS4"
                UpdateType="base"
                LocalPath="%BaseFolder%"
                Filename="gsg.kep" />
        <FileDescription
                ComponentID="PAS4"
                UpdateType="base"
                LocalPath="%BaseFolder%"
                Filename="ke.ver" />
        <FileDescription
                ComponentID="PAS4"
                UpdateType="base"
                LocalPath="%BaseFolder%"
                Filename="kis_ubllist_win.set.keb" />
        <FileDescription
                ComponentID="PAS4"
                UpdateType="base"
                LocalPath="%BaseFolder%"
                Filename="mcflt0912.keb" />
        <FileDescription
                ComponentID="PAS4"
                UpdateType="base"
                LocalPath="%BaseFolder%"
                Filename="profiles.keb" />
        <FileDescription
                ComponentID="PAS4"
                UpdateType="base"
                LocalPath="%BaseFolder%"
                Filename="profiles.kep" />
        <FileDescription
                ComponentID="PAS4"
                UpdateType="base"
                LocalPath="%BaseFolder%"
                Filename="regexps.keb" />
        <FileDescription
                ComponentID="PAS4"
                UpdateType="base"
                LocalPath="%BaseFolder%"
                Filename="src.keb" />
        <FileDescription
                ComponentID="PAS4"
                UpdateType="base"
                LocalPath="%BaseFolder%"
                Filename="upd_terms-full.keb" />
        <Registry
                ComponentID="CORE"
                UpdateType="KLKEY"
                LocalPath="%DSKM%"
                Body="S0xyZwH6/39LTHN3AACtrQEAAAD8AwAAAwAAFgEBAAAJAYtxHipAAFRmJWNA5aPFbk1b/MyImbWBWLPZucpT1uiVdxqx0CHXFfg5tA4e1UKeb3AOtCV5PGcCc/iuoHuC+TNRi25sKFsBAB4JoQAAAAIAAigEAFBBUzQDAAIoBABCQVNFAQAACcY1zOINCjs6MTBLTXZKcUYzWFk3andnYTVEYWhrSnJYNDZUTTVFamw5OUdnVHFaa1g4Mld5emJBb1VlMnRIWEp6Q2djaGZqQlJyNTNOQ05IY1hDSzhsa2lmQWQ4VUNDUSUl"
                Filename="pas4-0607g.pbv" />
        <Registry
                ComponentID="CORE"
                UpdateType="REGISTRY"
                LocalPath="%DSKM%"
                Body="S0xyZwGhAABLTHN3AACtrQEAAAD8AwAAAQAAAAEAABRqEgABACAAoURUzG47ruFdRojVZ0UEM156ieIKUCGrpFoORxMLsXwgAHVbouakIWlTeUDihc96netgpH8sgGseT2RCL8ZM1/IiIADQxntIXmF/kkhvFoxayQw9Q0WHMbnZmWF9n7rb8GTKCyAAbQjqDP1HOtjaCo5LXQ+PUtcg6PlexG1YnTtenUDjRAkgAMVR74Nta2CPe5i1qc/JdtAT5tIO6+Xhz++JppcMx1I/IADcaCXTzdPFg23keiUkNVqoNzpvCSq7PElfvEXDiOaF1yAAT3dGWw9u1rF7LvU8dk2NK6wBt5u0603Gck1glFh34ysgAFs9Ta0OLNH8bbMe/vGuxGFerMllDr+j0DfhA4xGxGqAIADk2QHGjcSoLgQlA0Yh+BwoS03IRXSqEueU2XdSwYkM4iAANWfGeGX5Cr6M8Px32c+uMefkywK3wCCNH5CHEjMLdbsgALJkdtJg2wX/vtzQ+WmjWV8JmG1p6QNWB3DCP1PDSR9oIADTbpvs57tubQAcJ1Qq0gd09A8jyqzXVh5lRQluJqOZ3yAASkqqZbT6yvIWkyyvsEDZv6DPgbJHIB7M1rIWPmJrMHggAP3t0ckGPdZ4iaUi5+RoDwr5vx3/etsCqGZeEP/8IGPVIADGbaIKwULK6Vx5T4LcqWL4bby/fbYIGTwJgiHJKx7hxSAADPf2dloqgjbsHCSH5lh1tdsJSo3U4F75ujC9SSwjAUsgAKbG6CmFXGlZCARvzu2BHPBru08MzVQRdeADsu6oOO+gIABnFaWO2etk3CeJZ45jKmmEKOO+BtLUPS41SJH2FGahHQEAHgmhAAAAAQAACRgxW4INCjs6MTA0VGtWNE52bjdHZWVEaEsydnBrMnpBREk1TkthQ0Rua3NPdyswdmxybVQwUXNYd2RJVkFTd2d1Z3E2MWlveUN0M2cxVHdJSCsrTWtCMkxpWVduMUpqbiUl"
                Filename="pas4-0607g.krg" />
</UpdateFiles>
;:10qKuOFLnyrCugmKr+9AQq7sequzrHR957HpnxL9vJ8qFB5TdxRaChybMp6ebvmqg2bUSmWoWjtz02360qZ/Q+ZZ%%

[ Last edited by feiying001 on 2009-12-28 at 21:09 ]

2009-12-28 21:07
查看资料  发短消息 网志   编辑帖子  回复  引用回复
feiying001
初级用户





积分 25
发帖 18
注册 2007-2-6
状态 离线
『第 2 楼』:  

能实现吗?

2009-12-29 12:52
查看资料  发短消息 网志   编辑帖子  回复  引用回复
qinchun36
高级用户

据说是李先生


积分 609
发帖 400
注册 2008-4-23
状态 离线
『第 3 楼』:  


@echo off
setlocal enabledelayedexpansion
:: 设置你那个文件(应该是XML的吧)的路径
set ching=FILENAME.EXT
set /a n=0
echo ============ 分析开始 =============
for /f "tokens=2 delims== " %%i in ('findstr /i "localpath filename" !ching!') do (
    set /a n+=1
    set /a r=!n!%%2
    if !r!==1 (
        set d=%%i
    ) else (
        set f=%%i
        echo 正在复制 !f! 到 !d! ...
        copy !f! !d!
    )
)
echo ============ 分析结束 =============
set /a ching=!n!/2
echo.
echo 共执行了 !ching! 组复制操作!
pause>nul


   此帖被 +1 点积分    点击查看详情   
评分人:【 feiying001 分数: +1  时间:2009-12-30 21:18




┏━━━━━━┓
┃据说是李先生┃
┠──────┨
┃*ntRSS┃
┗━━━━━━┛
2009-12-30 12:20
查看资料  发送邮件  发短消息 网志  OICQ (182484135)  编辑帖子  回复  引用回复
feiying001
初级用户





积分 25
发帖 18
注册 2007-2-6
状态 离线
『第 4 楼』:  



  Quote:
Originally posted by qinchun36 at 2009-12-30 12:20 PM:
[code]

@echo off
setlocal enabledelayedexpansion
:: 设置你那个文件(应该是XML的吧)的路径
set ching=FILENAME.EXT
set /a n=0
echo ============ 分析开始 =============
fo ...

思路及写的都非常好!这个文件是XML文件。不过不知道你注意了没有,ServerFolder=后面是路经名字,COPY的结果都写到一个文件里面了,不是在文件夹里面。
我修改如下:

@echo off
setlocal enabledelayedexpansion
:: 设置你那个文件(应该是XML的吧)的路径
set ching=bss-0607g.xml
set /a n=0
echo ============ 分析开始 =============
for /f "tokens=2 delims== " %%i in ('findstr /i "localpath filename" !ching!') do (
    set /a n+=1
    set /a r=!n!%%2
    if !r!==1 (
        set d=%%~i\
    ) else (
        set f=%%~i
        echo 正在复制 !f! 到 !d! ...
        copy !f! !d!
    )
)
echo ============ 分析结束 =============
set /a ching=!n!/2
echo.
echo 共执行了 !ching! 组复制操作!
pause>nul
这样就基本实现了我想要的效果,但在应用中我发现有的文件是这样的格式:
一、Filename="klif.sys"在前面,ServerFolder="9.0.0.459\sys\i386\5.1"在后面,有的并不是这样,请参考下面的内容
二、Filename="klif.sys"这个文件在复制中是有重复的,主要是根据系统不同进行的判断吧,怎么实现只取其中一个呢?重复的不再复制。
三、<Registry后面怎么进行排除?其实这里面的文件是不存在的

例子格式如下:
<UpdateFiles
        UpdateDate="03122009 1044"
        ObjectType="2=KAV9EXEC;3=BIN">
        <FileDescription
                Filename="klif.sys"
                ComponentID="KAV9Exec"
                UpdateType="executable"
                App="KAV 9.0.0.459; KIS 9.0.0.459"
                ServerFolder="9.0.0.459\sys\i386\5.1"
                FixName="a"
                OS="Win-XP"
                SysArch="i386"
                LocalPath="%WINDIR%\System32\drivers"
                ApplyPeriod="87600"
                ApplyReaction="restart_os" />
        <FileDescription
                Filename="klif.sys"
                ComponentID="KAV9Exec"
                UpdateType="executable"
                App="KAV 9.0.0.459; KIS 9.0.0.459"
                ServerFolder="9.0.0.459\sys\x64\5.2"
                FixName="a"
                OS="Win-XPx64"
                SysArch="x64"
                LocalPath="%WINDIR%\System32\drivers"
                ApplyPeriod="87600"
                ApplyReaction="restart_os" />
        <FileDescription
                Filename="oeas.dll"
                ComponentID="KAV9Exec"
                UpdateType="executable"
                App="KIS 9.0.0.736"
                ServerFolder="9.0.0.736\x64"
                FixName="a"
                SysArch="x64"
                LocalPath="%ProductFolder%\x64"
                ApplyPeriod="168"
                ApplyReaction="restart_os" />
        <FileDescription
                Filename="sbhook64.dll"
                ComponentID="KAV9Exec"
                UpdateType="executable"
                App="KIS 9.0.0.736"
                ServerFolder="9.0.0.736\x64"
                FixName="a"
                OS="Win-Vista,7"
                SysArch="x64"
                LocalPath="%ProductFolder%\x64"
                ApplyPeriod="168"
                ApplyReaction="restart_os" />
        <Registry
                ComponentID="CORE"
                UpdateType="KLKEY"
                LocalPath="%DSKM%"
                Body="S0xyZwH6/39LTHN3AACtrQEAAAD8AwAAAwAAFgEBAAAJAfU8HipAAFzn1lN6d7JrOuFZr0Ntsrj5hNME/jDXrSYsIbBFKoEaAaeVFSu49/RvrOjAIaFf4H+GMNLlZ5WfM8PzaxyIlDUBAB4JqgAAAAIAAigIAEtBVjlFWEVDAwACKAMAQklOAQAACfzXshQNCjs6MTBLNWNZS2dUUkpsUW44TThrTjIwT2tLYzZTcGNkZGZGdnp3Um1McVIvcVQ5anNqcnUrbC9LVmtoc1JBOTYxTko5TXorbmJqTjVjVUhTRlI5bHRUWnZvaCUl"
                Filename="kav9exec-0607g.pbv" />
        <Registry
                ComponentID="CORE"
                UpdateType="REGISTRY"
                LocalPath="%DSKM%"
                Body="S0xyZwGqAABLTHN3AACtrQEAAAD8AwAAAQAAAAEAABRqKAABACAAb5hFeUM1icaroNl8UWamkpanVfm82IeLOcJHeec2kXYgAIMtZGwVbtMKQhVdNULkAfqM70hObdh29Z4PvYlwjQOkIAA0XtB1JTby5rBzq3fpf77FMniNVIJnD5qp9sFMurH8jyAAhunJ708zV1aqiYX4ZGSQcsmctTkmEvT7CEHFqvQMee8gAB/kyNPr7HUxyat8j3PKiveKED0qQVKYyea9/UJdugCXIABSaKTKHSkBJKV1i2SYzi00TyTjzz1FW5MKUtpNIs4wwyAA0v20kvoPj1ZodjKvgUdTDuuych5xObyFNoOdlfd69dIgAEfxbsbQqt8JvQx7RMVSEjSqYbB0/VdVXCyUB0XZcNnAIACVF6Iw8xjeOHPiDA9Ci4BGgyh0fiEbPgkrmdJzwtFwCSAABBbvS/yQ
                Filename="kav9exec-0607g.krg" />
</UpdateFiles>
;:10K1quDqc/zwnZzVTxVwlLU6euhaPrlEYeNk/ipz8K3460WzJ80BGrMocy76NcMabZ/1Sy1rhK5uNL0gIoUf3Odu%%

2009-12-30 13:48
查看资料  发短消息 网志   编辑帖子  回复  引用回复
slore
铂金会员





积分 5212
发帖 2478
注册 2007-2-8
状态 离线
『第 5 楼』:  

mht2html



S smile 微笑,L love 爱,O optimism 乐观,R relax 放松,E enthusiasm 热情...Slore
2009-12-30 16:22
查看资料  发短消息 网志   编辑帖子  回复  引用回复
qinchun36
高级用户

据说是李先生


积分 609
发帖 400
注册 2008-4-23
状态 离线
『第 6 楼』:  

你说的去掉重复是什么意思?
比如你的 "klif.sys" 是随便复制一个,还是要根据 OS="Win-XP" 判断?



┏━━━━━━┓
┃据说是李先生┃
┠──────┨
┃*ntRSS┃
┗━━━━━━┛
2009-12-30 17:09
查看资料  发送邮件  发短消息 网志  OICQ (182484135)  编辑帖子  回复  引用回复
feiying001
初级用户





积分 25
发帖 18
注册 2007-2-6
状态 离线
『第 7 楼』:  

是复制一个到另外目录中,只要 一个即可,因为这个文件其实是这样的:Filename=后面是文件名字
ServerFolder=后面是程序自己要备份的路经
LocalPath=是程序从何处进行拷贝进行备份
但有一个问题是程序自己要备份时是从它自己的服务器下载相应文件的,如klif.sys,它会下载所有支持的系统相应文件并放入不同的文件夹内,而我自己备份时只备份自己系统上的klif.sys文件,因为我备份时可能本机并不联网的,所以只取一个即可。
从下面这段字符就可以知道我的意思了
        <FileDescription
                Filename="klif.sys"
                ComponentID="KAV9Exec"
                UpdateType="executable"
                App="KAV 9.0.0.459; KIS 9.0.0.459"
                ServerFolder="9.0.0.459\sys\i386\5.1"
                FixName="a"
                OS="Win-XP"
                SysArch="i386"
                LocalPath="%WINDIR%\System32\drivers"
                ApplyPeriod="87600"
                ApplyReaction="restart_os" />
        <FileDescription
                Filename="klif.sys"
                ComponentID="KAV9Exec"
                UpdateType="executable"
                App="KAV 9.0.0.459; KIS 9.0.0.459"
                ServerFolder="9.0.0.459\sys\x64\5.2"
                FixName="a"
                OS="Win-XPx64"
                SysArch="x64"
                LocalPath="%WINDIR%\System32\drivers"
                ApplyPeriod="87600"
                ApplyReaction="restart_os" />
我的意思是取Filename="klif.sys"中的klif.sys备份到LocalPath="%WINDIR%\System32\drivers"下面。也可以理解为恢复,因为我目前仅考虑实现的技术,做备份和恢复到时我做相应调整即可。从上面可以看到,要备份(恢复)的路经是相同的,而且此xml文件里面其实有很多段这样的情况,我拷贝例子时仅拷贝了一小部分内容。

[ Last edited by feiying001 on 2009-12-30 at 18:19 ]

2009-12-30 18:18
查看资料  发短消息 网志   编辑帖子  回复  引用回复
qinchun36
高级用户

据说是李先生


积分 609
发帖 400
注册 2008-4-23
状态 离线
『第 8 楼』:  

还是没明白你对于重复的怎么搞。。。

我没办法用BAT搞定,给你写了个智能的脚本,你什么都不用准备,把下面的代码保存为 解析.hta ,双击运行,选择你要处理的文件,然后点“生成批处理”就能得到批处理代码了,自己保存为BAT吧,看看是不是你需要的效果
<meta http-equiv="Content-Type" content="text/html; charset=GB18030" />
选择你要处理的XML文件:<input type="file" name="ching" id="ching" />
<input type="button" value="生成批处理" onclick="javascript:generate(ching.value);"/>
<script type="text/javascript">
        var fso = new ActiveXObject("Scripting.FileSystemObject");
        function readText(sFileName) {
                var f = fso.OpenTextFile(sFileName);
                return f.ReadAll();
        }
        function getFilePathMapping(sFileName){
                var files = new Array();
                var paths = new Array();
                var text = readText(sFileName);
                document.write(text);
                var tmp1 = document.getElementsByTagName("FileDescription");
                for(var i=0; i<tmp1.length; i++) {
                        var tmp2 = tmp1[i].outerHTML;
                        var tmp3 = tmp2.replace(/[\n\r]/g, "");
                        var tmp4 = tmp3.replace(/.*Filename[^\"]*(\"[^\"]*\").*/gi, "$1").replace(/\"/g, "");
                        var tmp5 = tmp3.replace(/.*LocalPath[^\"]*(\"[^\"]*\").*/gi, "$1").replace(/\"/g, "") + "\\" + tmp4;
                        var flag = 0;
                        for(var j = 0; j < files.length; j++) {
                                if(files[j] == tmp4) flag = 1;
                        }
                        if(flag==0) {
                                files.push(tmp4);
                                paths.push(tmp5);
                        }
                }
                return new Array(files, paths);
        }
        function generate(sFileName) {
                var FP = getFilePathMapping(sFileName);
                document.write("<h1 style='filter: blur(direction=135,strength=8); width: 600px; color: #990099; height: 10px'><font face='楷体_gb2312'>批处理代码</font></h1><br><br><br><div style='{background-color: #CC99CC;}'><pre>@echo off<br>::auto generated by qinchun36<br>");
                for(var i=0; i<FP[0].length; i++) {
                        document.write("copy \"" + FP[0][i] + "\" \"" + FP[1][i] + "\"<br>");
                }
                document.write("</pre></div>");
        }
</script>


   此帖被 +1 点积分    点击查看详情   
评分人:【 feiying001 分数: +1  时间:2009-12-30 21:18




┏━━━━━━┓
┃据说是李先生┃
┠──────┨
┃*ntRSS┃
┗━━━━━━┛
2009-12-30 20:32
查看资料  发送邮件  发短消息 网志  OICQ (182484135)  编辑帖子  回复  引用回复
feiying001
初级用户





积分 25
发帖 18
注册 2007-2-6
状态 离线
『第 9 楼』:  

这个程序写的太好了!!!我正想达到这个效果!
不过根据你的代码经过修改也基本能达到我的需求。我所缺的就是SET参数不会循环调用。
学习了!!!
另外问一下:怎么给你的回答做加分呀?

另外有个帖子是别人引用的我第二次修改的批处理代码(卡巴斯基的备份工具)其中有的代码不完善,但由于工作太忙原因,我QQ:350345348很长时间没上,已经被收回了。等 我写好这个会发给大家交流的。

[ Last edited by feiying001 on 2009-12-30 at 21:32 ]

2009-12-30 21:17
查看资料  发短消息 网志   编辑帖子  回复  引用回复

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


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



论坛跳转: