中国DOS联盟

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

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

中国DOS联盟论坛
现在时间是 2026-08-10 09:03
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » [已结]如何根据文 本 文 件的内容拷贝数据 查看 2,265 回复 28
16 发表于 2008-11-08 16:47 ·  中国 江西 赣州 电信
银牌会员
★★★★
积分 2,025
发帖 1,122
注册 2007-09-05 20:15
18年会员
UID 96653
性别 男
状态 离线
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。再试试以下代码:
@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 || (
>>b.txt echo %%a
pause & exit /b
)
)


[ Last edited by tireless on 2008-11-8 at 16:49 ]
17 发表于 2008-11-08 16:59 ·  中国 北京 昌平区 联通
新手上路
积分 17
发帖 16
注册 2008-11-07 22:59
17年会员
UID 130332
性别 男
状态 离线
16楼的代码只将最后一行没有拷贝成功的内容输出到了b.txt,a.txt后面的部分没有输出到b.txt中,批处理就退出了。仍然有缺憾。
请再次赐教!
18 发表于 2008-11-08 18:09 ·  中国 江西 赣州 电信
银牌会员
★★★★
积分 2,025
发帖 1,122
注册 2007-09-05 20:15
18年会员
UID 96653
性别 男
状态 离线
@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 || (
>>b.txt echo %%a
for /f "delims=:" %%? in ('findstr /n "%%a" a.txt') do more +%%? a.txt >> b.txt
pause & exit /b
)
)
19 发表于 2008-11-09 00:27 ·  中国 北京 昌平区 联通
新手上路
积分 17
发帖 16
注册 2008-11-07 22:59
17年会员
UID 130332
性别 男
状态 离线
tireless:老麻烦你实在不好意思。
18楼的代码测试与16楼的结果是一样的。也是只把最后一行没有拷贝成功的内容输出到了b.txt,显示了一行磁盘空间不足后,任意键就退出了。
麻烦再想想还没有有更好的方案?
20 发表于 2008-11-09 00:52 ·  中国 江西 赣州 电信
银牌会员
★★★★
积分 2,025
发帖 1,122
注册 2007-09-05 20:15
18年会员
UID 96653
性别 男
状态 离线
是我不好意思...功力不够却老爱去回答别人的问题,总是会出现错误,很抱歉。先去 sleep 了,明天再想想...
21 发表于 2008-11-09 01:09 ·  中国 北京 昌平区 联通
新手上路
积分 17
发帖 16
注册 2008-11-07 22:59
17年会员
UID 130332
性别 男
状态 离线
共同探讨共同进步,我从你的回答里也学到了不少东西,给我很多启发,总之多谢你的热心相助!祝你晚安。
22 Re 20楼 发表于 2008-11-09 01:45 ·  中国 重庆 电信
版主
★★★★★
积分 9,023
发帖 5,017
注册 2007-05-31 19:39
19年会员
UID 89899
性别 男
状态 离线
任何人都是从不会到会走过来的,古人教育我们:闻道有先后,术业有专攻,如是而已。
tireless 兄不必过谦,你乐于助人的精神值得所有人学习。
23 发表于 2008-11-09 11:19 ·  中国 江西 赣州 电信
银牌会员
★★★★
积分 2,025
发帖 1,122
注册 2007-09-05 20:15
18年会员
UID 96653
性别 男
状态 离线
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 发表于 2008-11-09 19:44 ·  中国 北京 昌平区 联通
新手上路
积分 17
发帖 16
注册 2008-11-07 22:59
17年会员
UID 130332
性别 男
状态 离线
我又来了,呵呵!
这样做是不是容易些。直接把拷贝完成的行从a.txt中删掉,不用把没拷贝的行输出到b.txt了,剩下的就是没有拷贝完成的。容易实现否?
25 发表于 2008-11-09 21:17 ·  中国 江西 赣州 电信
银牌会员
★★★★
积分 2,025
发帖 1,122
注册 2007-09-05 20:15
18年会员
UID 96653
性别 男
状态 离线
找到原因了,因为:

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 来找就没问题了。代码:
@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 || (
>>b.txt echo %%a
for /f "skip=2 delims=" %%i in ('find /n "%%a" a.txt') do more +%%i a.txt >> b.txt
pause & exit /b
)
)


[ Last edited by tireless on 2008-11-9 at 22:52 ]
本帖最近评分记录 (共 1 条) 点击查看详情
评分人分数时间
HAT +2 2008-11-10 10:42
26 发表于 2008-11-09 22:46 ·  中国 北京 昌平区 联通
新手上路
积分 17
发帖 16
注册 2008-11-07 22:59
17年会员
UID 130332
性别 男
状态 离线
OK,测试通过,完全达到要求。

对tireless的热心相助表示万分感谢!
27 发表于 2008-11-10 10:48 ·  中国 北京 鹏博士BGP
新手上路
积分 17
发帖 16
注册 2008-11-07 22:59
17年会员
UID 130332
性别 男
状态 离线
再请教一下:我用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 那不用 more,用 for 好了。 发表于 2008-11-11 01:22 ·  中国 江西 赣州 安远县 电信
银牌会员
★★★★
积分 2,025
发帖 1,122
注册 2007-09-05 20:15
18年会员
UID 96653
性别 男
状态 离线
@echo off
for /f "delims=" %%a in (a.txt) do (
if not exist "%%a" (>>b.txt echo %%a) else (
if not exist "F:%%~pa" md "F:%%~pa"
copy /y "%%a" "F:%%~pa" >nul || (
echo 正在输出未被复制的文件路径至 b.txt...
>>b.txt echo %%a
for /f "skip=2 delims=" %%i in ('find /n "%%a" a.txt') do (
set n=%%i
goto end
)
)
)
)

:end
for /f "skip=%n% delims=" %%o in (a.txt) do echo %%o>>b.txt
echo 输出完毕。请按任意键退出...
pause>nul & exit /b


[ Last edited by tireless on 2008-11-12 at 15:25 ]
本帖最近评分记录 (共 1 条) 点击查看详情
评分人分数时间
HAT +2 2008-11-11 12:13
29 发表于 2008-11-11 11:33 ·  中国 北京 鹏博士BGP
新手上路
积分 17
发帖 16
注册 2008-11-07 22:59
17年会员
UID 130332
性别 男
状态 离线
这样就没有什么问题了。非常感谢!
论坛跳转: