中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --
联盟域名:www.cn-dos.net 论坛域名:www.cn-dos.net/forum
游客 | 登录 | 注册 | 会员 | 搜索 | 中国DOS联盟
中国DOS联盟论坛
现在时间是 2026-08-12 23:20
47,811 主题排行 / 349,897 发帖 / 今日 0 篇 / 48,256 会员排行
DOS批处理 & 脚本技术(批处理室) » FINDSTR如何从文本中循环查找并拷贝文件
可打印版本  973 / 14
第1楼 feiying001 发表于 2010-01-09 15:39
初级用户 发帖 18 积分 25
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的变量值,如何设置这个变量 ?
第2楼 HAT 发表于 2010-01-09 16:22
版主 发帖 5,017 积分 9,023
for和findstr都是行缓冲的,你的代码里面for无法知道findstr找到的究竟是哪个关键字。
这个问题不是你那两三行代码所能够解决的。
第3楼 feiying001 发表于 2010-01-09 17:34
初级用户 发帖 18 积分 25
Originally posted by HAT at 2010-1-9 04:22 PM:
for和findstr都是行缓冲的,你的代码里面for无法知道findstr找到的究竟是哪个关键字。
这个问题不是你那两三行代码所能够解决的。

这个应该能够实现,只是三个变量我写不好,两个变量已经有人写出过。
第4楼 feiying001 发表于 2010-01-09 19:03
初级用户 发帖 18 积分 25
换个思路:
把查找到的字符写入到一个文本中,然后再做截取字符作为变量,大家看看怎么写入到一行中去,中间加个我们再次截取的符号。
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"
如何写代码?
第5楼 HAT 发表于 2010-01-09 19:24
版主 发帖 5,017 积分 9,023
Re 3楼
能否把“有人写出过”的就像你那两三行似的代码贴出来让大家看看?
第6楼 feiying001 发表于 2010-01-09 20:02
初级用户 发帖 18 积分 25
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!\"
)
)
第7楼 feiying001 发表于 2010-01-09 20:11
初级用户 发帖 18 积分 25
这个代码只考虑要拷贝的文件在当前目录下,可以实现,但有的文件并不全是在当前目录下面,可能是当前目录的一个文件夹的子目录下面,所以我想直接取绝对路径(做拷贝时加个根目录即可),从代码中就可以提取。
第8楼 q8249014 发表于 2010-01-09 21:01
初级用户 发帖 45 积分 175


楼主能否在说清楚点儿?

[ Last edited by q8249014 on 2010-1-9 at 21:10 ]
第9楼 feiying001 发表于 2010-01-09 21:19
初级用户 发帖 18 积分 25
Originally posted by q8249014 at 2010-1-9 09:01 PM:
第10楼 feiying001 发表于 2010-01-09 21:26
初级用户 发帖 18 积分 25
代码没写完整呀!不用真实做拷贝,提出三个内容做变量就可以了,如:!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 ]
第11楼 q8249014 发表于 2010-01-09 21:29
初级用户 发帖 45 积分 175
你给出一个具体的文本内容
顺便给出示例
8f的代码是依据你楼顶所述所写
你顶楼不就是要这几个值吗?

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

[ Last edited by q8249014 on 2010-1-9 at 21:30 ]
第12楼 feiying001 发表于 2010-01-09 21:44
初级用户 发帖 18 积分 25
看上面10#我修改过的内容应该能明白我的意思了。
第13楼 q8249014 发表于 2010-01-09 22:22
初级用户 发帖 45 积分 175


更新一下,昨晚想了下,还是用这样写好点

和你楼下的一样了

不过我认为最好还是判断标签

[ Last edited by q8249014 on 2010-1-10 at 15:24 ]
第14楼 feiying001 发表于 2010-01-09 22:53
初级用户 发帖 18 积分 25
看了一天帖子找相关资料,谢谢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 ]
第15楼 asnahu 发表于 2010-01-10 15:15
初级用户 发帖 53 积分 99
是把filenam的值对应的文件拷贝到serverfolder的值对应的目录下?
[ 联系联盟系统管理团队 - 中国DOS联盟 - 标准版 ]
Sponsored by ifanr Inc | © 2001–2023