中国DOS联盟论坛

中国DOS联盟

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

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

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » FINDSTR如何从文本中循环查找并拷贝文件
作者:
标题: FINDSTR如何从文本中循环查找并拷贝文件 上一主题 | 下一主题
feiying001
初级用户





积分 25
发帖 18
注册 2007-2-6
状态 离线
『楼 主』:  FINDSTR如何从文本中循环查找并拷贝文件

文本内容1.txt格式如下
        <File
                Filename="adi.pl"
                UpdateType="executable"
                ServerFolder="357"
                FixName="e"
                Path="%Folder%" />
        <File
                Filename="aish.pl"
                UpdateType="cutable"
                ServerFolder="459"
                FixName="c"
                Path="%Prodr%"/>
                                。。。。。。。。。。后面很多这样的格式


要实现的目的:从%Folder%拷贝adi.pl到357下面
                    从%Prodr%拷贝aish.pl到459下面
                   。。。。。。。。。。。。。
不要临时文件实现方法:
@echo off& setlocal enabledelayedexpansion
set /a n=0
for /f "tokens=2 delims==^> " %%i in ('findstr "Filename ServerFolder Path" 1.txt')do (set ????  xcopy /y /f "!F!\!S!" "!P!\")
中间的F为Filename的变量值,S为ServerFolder的变量,P为Path的变量值,如何设置这个变量 ?

2010-1-9 15:39
查看资料  发短消息 网志   编辑帖子  回复  引用回复
HAT
版主





积分 9023
发帖 5017
注册 2007-5-31
状态 离线
『第 2 楼』:  

for和findstr都是行缓冲的,你的代码里面for无法知道findstr找到的究竟是哪个关键字。
这个问题不是你那两三行代码所能够解决的。



2010-1-9 16:22
查看资料  发短消息 网志   编辑帖子  回复  引用回复
feiying001
初级用户





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



  Quote:
Originally posted by HAT at 2010-1-9 04:22 PM:
for和findstr都是行缓冲的,你的代码里面for无法知道findstr找到的究竟是哪个关键字。
这个问题不是你那两三行代码所能够解决的。

这个应该能够实现,只是三个变量我写不好,两个变量已经有人写出过。

2010-1-9 17:34
查看资料  发短消息 网志   编辑帖子  回复  引用回复
feiying001
初级用户





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

换个思路:
把查找到的字符写入到一个文本中,然后再做截取字符作为变量,大家看看怎么写入到一行中去,中间加个我们再次截取的符号。
for /f "tokens=1,2 delims==^> " %%i in ('findstr /i "Filename ServerFolder Path" 1.txt') do echo %%j>>2.txt
这样2.txt的结果是:
"%ProductFolder%"
"fssync.dll"
"357"
"%ProductFolder%"
"hips.ppl"
"457"
我想要这样的效果:
"%ProductFolder%"-"fssync.dll"-"357"
"%ProductFolder%"-"hips.ppl"-"457"
如何写代码?

2010-1-9 19:03
查看资料  发短消息 网志   编辑帖子  回复  引用回复
HAT
版主





积分 9023
发帖 5017
注册 2007-5-31
状态 离线
『第 5 楼』:  Re 3楼

能否把“有人写出过”的就像你那两三行似的代码贴出来让大家看看?



2010-1-9 19:24
查看资料  发短消息 网志   编辑帖子  回复  引用回复
feiying001
初级用户





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

qinchun36写的,我修改了下:
@echo off
setlocal enabledelayedexpansion
:: 设置你那个文件(应该是XML的吧)的路径
set ching="1.txt"
set /a n=0
echo ============ 分析开始 =============
for /f "tokens=2 delims==^> " %%i in ('findstr /i "ServerFolder Filename" !ching!') do (
    set /a n+=1
    set /a r=!n!%%2
    if !r!==1 (
        set d=%%~i
    ) else (
        set f=%%~i
        echo 正在复制!f! 到 %temp%\!d!\ ...&pause
        xcopy /y /f "!f!" "%temp%\!d!\"
    )
)

2010-1-9 20:02
查看资料  发短消息 网志   编辑帖子  回复  引用回复
feiying001
初级用户





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

这个代码只考虑要拷贝的文件在当前目录下,可以实现,但有的文件并不全是在当前目录下面,可能是当前目录的一个文件夹的子目录下面,所以我想直接取绝对路径(做拷贝时加个根目录即可),从代码中就可以提取。

2010-1-9 20:11
查看资料  发短消息 网志   编辑帖子  回复  引用回复
q8249014
初级用户





积分 175
发帖 45
注册 2007-8-4
状态 离线
『第 8 楼』:  


@echo off&setlocal enabledelayedexpansion
for /f "tokens=1,2 delims==/> " %%i in ('findstr /i "Filename ServerFolder Path" 1.txt') do (
     if /i %%i neq path (set "%%i=%%~j") else (set "p=%%j")
     if defined p (
        echo "!Filename!\!ServerFolder!" !p!
        set "Filename="
        set "ServerFolder="
        set "p="
     )
)  
pause
楼主能否在说清楚点儿?

[ Last edited by q8249014 on 2010-1-9 at 21:10 ]

2010-1-9 21:01
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
feiying001
初级用户





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



  Quote:
Originally posted by q8249014 at 2010-1-9 09:01 PM:
[code]
@echo off&setlocal enabledelayedexpansion
for /f "tokens=1,2 delims==/> " %%i in ('findstr /i "Filename ServerFolder Path" 1.txt') do (
     if /i %%i neq path  ...

测试下你的代码!其实就是提取三个变量,要拷贝的文件名字,拷贝的路经和从何处拷贝,因为此文件内容有多个,所以要做依次提取。至于要提取的路经是否标准不要紧,可以前面提前做处理设置一下就行。

2010-1-9 21:19
查看资料  发短消息 网志   编辑帖子  回复  引用回复
feiying001
初级用户





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

代码没写完整呀!不用真实做拷贝,提出三个内容做变量就可以了,如:!X!!Y!!Z!
这三个变量分别代表Filename ServerFolder Path这三个内容。
改写下代码格式吧,好理解些,1.txt内容如下
        <File
                Filename="adi.txt"
                UpdateType="executable"
                ServerFolder="c:\357"
                FixName="e"
                Path="d:\111" />
        <File
                Filename="aish.txt"
                UpdateType="cutable"
                ServerFolder="c:\459\"
                FixName="c"
                Path="d:\111\222"/>
实现的效果为拷贝c:\357下面的adi.txt到d:\111下
                  拷贝c:\459下面的aish.txt到d:\111\222下
请注意:Path="d:\111" />后面的 />前有空格,第二个没有空格,所以我的代码加了这一句"tokens=1,2 delims==^> "以便在提取时精确些。

[ Last edited by feiying001 on 2010-1-9 at 21:42 ]

2010-1-9 21:26
查看资料  发短消息 网志   编辑帖子  回复  引用回复
q8249014
初级用户





积分 175
发帖 45
注册 2007-8-4
状态 离线
『第 11 楼』:  

你给出一个具体的文本内容
顺便给出示例
8f的代码是依据你楼顶所述所写
你顶楼不就是要这几个值吗?

你仔细看了吗?
我是用echo显示的
没用复制命令哦

[ Last edited by q8249014 on 2010-1-9 at 21:30 ]

2010-1-9 21:29
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
feiying001
初级用户





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

看上面10#我修改过的内容应该能明白我的意思了。

2010-1-9 21:44
查看资料  发短消息 网志   编辑帖子  回复  引用回复
q8249014
初级用户





积分 175
发帖 45
注册 2007-8-4
状态 离线
『第 13 楼』:  


@echo off&setlocal enabledelayedexpansion
set n=0
for /f "tokens=1,2 delims==/> " %%i in ('findstr /i "Filename ServerFolder Path" 1.txt') do (
    if /i %%i neq path (set "%%i=%%~j") else (set "p=%%~j")
    set /a n+=1
    if !n! equ 3 (
       echo !ServerFolder!\!Filename! !P!
       set n=0
    )
)
pause
更新一下,昨晚想了下,还是用这样写好点

和你楼下的一样了

不过我认为最好还是判断标签 [/>]

[ Last edited by q8249014 on 2010-1-10 at 15:24 ]

2010-1-9 22:22
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
feiying001
初级用户





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

看了一天帖子找相关资料,谢谢q8249014和版主HAT!
自己写个代码大家看看能不能精简:


@echo off&setlocal enabledelayedexpansion
for /f "tokens=2 delims==/> " %%i in ('findstr /i "Filename ServerFolder Path" 1.txt') do (
     set /a n+=1
     set !n!line=%%i
     if !n! equ 3 (
     echo !1line!---!2line!---!3line!
     set /a n=0
     )
)
endlocal
pause

[ Last edited by feiying001 on 2010-1-9 at 22:54 ]

2010-1-9 22:53
查看资料  发短消息 网志   编辑帖子  回复  引用回复
asnahu
初级用户





积分 99
发帖 53
注册 2006-8-18
状态 离线
『第 15 楼』:  

是把filenam的值对应的文件拷贝到serverfolder的值对应的目录下?

2010-1-10 15:15
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复

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


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



论坛跳转: