中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --
联盟域名:www.cn-dos.net 论坛域名:www.cn-dos.net/forum
游客 | 登录 | 注册 | 会员 | 搜索 | 中国DOS联盟
中国DOS联盟论坛
现在时间是 2026-08-10 10:00
47,811 主题排行 / 349,897 发帖 / 今日 0 篇 / 48,255 会员排行
DOS批处理 & 脚本技术(批处理室) » [已结]如何根据文 本 文 件的内容拷贝数据
可打印版本  2,268 / 28
第16楼 tireless 发表于 2008-11-08 16:47
银牌会员 发帖 1,122 积分 2,025
if not exist "%%a" (>>b.txt echo %%a) else copy /y "%%a" "F:%%~pa" >nul || pause & exit /b

这句的意思是:

如果文件不存在,则把文件路径输出到 b.txt。如果文件存在就执行 else 后面的语句了 —— 复制文件,而如果不成功的话就暂停接着退出。

14 楼的代码确实不会将“磁盘空间不足”时没有被复制的文件路径输出到 b.txt,只将不存在的文件路径输出到 b.txt。再试试以下代码:


[ Last edited by tireless on 2008-11-8 at 16:49 ]
第17楼 lsjiang 发表于 2008-11-08 16:59
新手上路 发帖 16 积分 17
16楼的代码只将最后一行没有拷贝成功的内容输出到了b.txt,a.txt后面的部分没有输出到b.txt中,批处理就退出了。仍然有缺憾。
请再次赐教!
第18楼 tireless 发表于 2008-11-08 18:09
银牌会员 发帖 1,122 积分 2,025
第19楼 lsjiang 发表于 2008-11-09 00:27
新手上路 发帖 16 积分 17
tireless:老麻烦你实在不好意思。
18楼的代码测试与16楼的结果是一样的。也是只把最后一行没有拷贝成功的内容输出到了b.txt,显示了一行磁盘空间不足后,任意键就退出了。
麻烦再想想还没有有更好的方案?
第20楼 tireless 发表于 2008-11-09 00:52
银牌会员 发帖 1,122 积分 2,025
是我不好意思...功力不够却老爱去回答别人的问题,总是会出现错误,很抱歉。先去 sleep 了,明天再想想...
第21楼 lsjiang 发表于 2008-11-09 01:09
新手上路 发帖 16 积分 17
共同探讨共同进步,我从你的回答里也学到了不少东西,给我很多启发,总之多谢你的热心相助!祝你晚安。
第22楼 HAT 发表于 2008-11-09 01:45
版主 发帖 5,017 积分 9,023
Re 20楼
任何人都是从不会到会走过来的,古人教育我们:闻道有先后,术业有专攻,如是而已。
tireless 兄不必过谦,你乐于助人的精神值得所有人学习。
第23楼 tireless 发表于 2008-11-09 11:19
银牌会员 发帖 1,122 积分 2,025
Originally posted by lsjiang at 2008-11-9 12:27 AM:
18楼的代码测试与16楼的结果是一样的。也是只把最后一行没有拷贝成功的内容输出到了b.txt,显示了一行磁盘空间不足后,任意键就退出了。
麻烦再想想还没有有更好的方案?

那就奇怪了...
copy /y "%%a" "F:%%~pa" >nul || (
>>b.txt echo %%a
for /f "delims=:" %%? in ('findstr /n "%%a" a.txt') do more +%%? a.txt >> b.txt
pause & exit /b
)

括号里的第一行和第三行都执行成功,怎么第二行就没执行成功呢?
第24楼 lsjiang 发表于 2008-11-09 19:44
新手上路 发帖 16 积分 17
我又来了,呵呵!
这样做是不是容易些。直接把拷贝完成的行从a.txt中删掉,不用把没拷贝的行输出到b.txt了,剩下的就是没有拷贝完成的。容易实现否?
第25楼 tireless 发表于 2008-11-09 21:17
银牌会员 发帖 1,122 积分 2,025
找到原因了,因为:

findstr /n "e:\book\abc\sample1.pdf" a.txt

文件名与扩展名中间的点在 findstr 中有特殊意义。而换成使用 /c: 碰到中文也会有问题:

找得到:
findstr /n /c:"e:\book\abc\i'm here.pdf" a.txt

找不到:
findstr /n /c:"e:\book\abc\找不到 我.pdf" a.txt

——————————————————————————————————————————————————

使用 find.exe 来找就没问题了。代码:


[ Last edited by tireless on 2008-11-9 at 22:52 ]
第26楼 lsjiang 发表于 2008-11-09 22:46
新手上路 发帖 16 积分 17
OK,测试通过,完全达到要求。

对tireless的热心相助表示万分感谢!
第27楼 lsjiang 发表于 2008-11-10 10:48
新手上路 发帖 16 积分 17
再请教一下:我用tireless的方法成功实现了所需功能,有个小问题,如果a.txt 中没有拷贝成功的行超过65535的话,用more输出就有问题了,如何突破呢?
如果用把拷贝成功的行删除话如何实现呢?
用下面的代码会把源文件中的文件删除了,如何只删除a.txt中已拷贝的行呢?
@echo off
for /f "delims=" %%a in (a.txt) do (
if not exist "F:%%~pa" md "F:%%~pa"
if not exist "%%a" (>>b.txt echo %%a) else copy /y "%%a" "F:%%~pa" >nul && del %%a

[ Last edited by lsjiang on 2008-11-10 at 17:47 ]
第28楼 tireless 发表于 2008-11-11 01:22
银牌会员 发帖 1,122 积分 2,025
那不用 more,用 for 好了。


[ Last edited by tireless on 2008-11-12 at 15:25 ]
第29楼 lsjiang 发表于 2008-11-11 11:33
新手上路 发帖 16 积分 17
这样就没有什么问题了。非常感谢!
上一页  1 2
[ 联系联盟系统管理团队 - 中国DOS联盟 - 标准版 ]
Sponsored by ifanr Inc | © 2001–2023