标题: 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的值对应的目录下?