Board logo

标题: FINDSTR如何从文本中循环查找并拷贝文件 [打印本页]

作者: feiying001     时间: 2010-1-9 15:39    标题: 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的变量值,如何设置这个变量 ?
作者: HAT     时间: 2010-1-9 16:22
for和findstr都是行缓冲的,你的代码里面for无法知道findstr找到的究竟是哪个关键字。
这个问题不是你那两三行代码所能够解决的。
作者: feiying001     时间: 2010-1-9 17:34


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

这个应该能够实现,只是三个变量我写不好,两个变量已经有人写出过。
作者: feiying001     时间: 2010-1-9 19:03
换个思路:
把查找到的字符写入到一个文本中,然后再做截取字符作为变量,大家看看怎么写入到一行中去,中间加个我们再次截取的符号。
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"
如何写代码?
作者: HAT     时间: 2010-1-9 19:24    标题: Re 3楼

能否把“有人写出过”的就像你那两三行似的代码贴出来让大家看看?
作者: feiying001     时间: 2010-1-9 20:02
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!\"
    )
)
作者: feiying001     时间: 2010-1-9 20:11
这个代码只考虑要拷贝的文件在当前目录下,可以实现,但有的文件并不全是在当前目录下面,可能是当前目录的一个文件夹的子目录下面,所以我想直接取绝对路径(做拷贝时加个根目录即可),从代码中就可以提取。
作者: q8249014     时间: 2010-1-9 21:01

@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 ]
作者: feiying001     时间: 2010-1-9 21:19


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

测试下你的代码!其实就是提取三个变量,要拷贝的文件名字,拷贝的路经和从何处拷贝,因为此文件内容有多个,所以要做依次提取。至于要提取的路经是否标准不要紧,可以前面提前做处理设置一下就行。
作者: feiying001     时间: 2010-1-9 21:26
代码没写完整呀!不用真实做拷贝,提出三个内容做变量就可以了,如:!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 ]
作者: q8249014     时间: 2010-1-9 21:29
你给出一个具体的文本内容
顺便给出示例
8f的代码是依据你楼顶所述所写
你顶楼不就是要这几个值吗?

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

[ Last edited by q8249014 on 2010-1-9 at 21:30 ]
作者: feiying001     时间: 2010-1-9 21:44
看上面10#我修改过的内容应该能明白我的意思了。
作者: q8249014     时间: 2010-1-9 22:22

@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 ]
作者: feiying001     时间: 2010-1-9 22:53
看了一天帖子找相关资料,谢谢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 ]
作者: asnahu     时间: 2010-1-10 15:15
是把filenam的值对应的文件拷贝到serverfolder的值对应的目录下?