中国DOS联盟论坛

中国DOS联盟

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

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

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » [已结]如何根据文 本 文 件的内容拷贝数据
« [1] [2] »
作者:
标题: [已结]如何根据文 本 文 件的内容拷贝数据 上一主题 | 下一主题
tireless
银牌会员





积分 2025
发帖 1122
注册 2007-9-5
状态 离线
『第 16 楼』:  

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 ]

2008-11-8 16:47
查看资料  发短消息 网志   编辑帖子  回复  引用回复
lsjiang
新手上路





积分 17
发帖 16
注册 2008-11-7
状态 离线
『第 17 楼』:  

16楼的代码只将最后一行没有拷贝成功的内容输出到了b.txt,a.txt后面的部分没有输出到b.txt中,批处理就退出了。仍然有缺憾。
请再次赐教!

2008-11-8 16:59
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
tireless
银牌会员





积分 2025
发帖 1122
注册 2007-9-5
状态 离线
『第 18 楼』:  


@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
  )
)


2008-11-8 18:09
查看资料  发短消息 网志   编辑帖子  回复  引用回复
lsjiang
新手上路





积分 17
发帖 16
注册 2008-11-7
状态 离线
『第 19 楼』:  

tireless:老麻烦你实在不好意思。
18楼的代码测试与16楼的结果是一样的。也是只把最后一行没有拷贝成功的内容输出到了b.txt,显示了一行磁盘空间不足后,任意键就退出了。
麻烦再想想还没有有更好的方案?

2008-11-9 00:27
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
tireless
银牌会员





积分 2025
发帖 1122
注册 2007-9-5
状态 离线
『第 20 楼』:  

是我不好意思...功力不够却老爱去回答别人的问题,总是会出现错误,很抱歉。先去 sleep 了,明天再想想...

2008-11-9 00:52
查看资料  发短消息 网志   编辑帖子  回复  引用回复
lsjiang
新手上路





积分 17
发帖 16
注册 2008-11-7
状态 离线
『第 21 楼』:  

共同探讨共同进步,我从你的回答里也学到了不少东西,给我很多启发,总之多谢你的热心相助!祝你晚安。

2008-11-9 01:09
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
HAT
版主





积分 9023
发帖 5017
注册 2007-5-31
状态 离线
『第 22 楼』:  Re 20楼

任何人都是从不会到会走过来的,古人教育我们:闻道有先后,术业有专攻,如是而已。
tireless 兄不必过谦,你乐于助人的精神值得所有人学习。



2008-11-9 01:45
查看资料  发短消息 网志   编辑帖子  回复  引用回复
tireless
银牌会员





积分 2025
发帖 1122
注册 2007-9-5
状态 离线
『第 23 楼』:  



  Quote:
Originally posted by lsjiang at 2008-11-9 12:27 AM:
18楼的代码测试与16楼的结果是一样的。也是只把最后一行没有拷贝成功的内容输出到了b.txt,显示了一行磁盘空间不足后,任意键就退出了。
麻烦再想想还没有有更好的方案?

那就奇怪了...

  Quote:
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
  )

括号里的第一行和第三行都执行成功,怎么第二行就没执行成功呢?

2008-11-9 11:19
查看资料  发短消息 网志   编辑帖子  回复  引用回复
lsjiang
新手上路





积分 17
发帖 16
注册 2008-11-7
状态 离线
『第 24 楼』:  

我又来了,呵呵!
这样做是不是容易些。直接把拷贝完成的行从a.txt中删掉,不用把没拷贝的行输出到b.txt了,剩下的就是没有拷贝完成的。容易实现否?

2008-11-9 19:44
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
tireless
银牌会员





积分 2025
发帖 1122
注册 2007-9-5
状态 离线
『第 25 楼』:  

找到原因了,因为:

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 ]

   此帖被 +2 点积分    点击查看详情   
评分人:【 HAT 分数: +2  时间:2008-11-10 10:42


2008-11-9 21:17
查看资料  发短消息 网志   编辑帖子  回复  引用回复
lsjiang
新手上路





积分 17
发帖 16
注册 2008-11-7
状态 离线
『第 26 楼』:  

OK,测试通过,完全达到要求。

对tireless的热心相助表示万分感谢!

2008-11-9 22:46
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
lsjiang
新手上路





积分 17
发帖 16
注册 2008-11-7
状态 离线
『第 27 楼』:  

再请教一下:我用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 ]

2008-11-10 10:48
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
tireless
银牌会员





积分 2025
发帖 1122
注册 2007-9-5
状态 离线
『第 28 楼』:  那不用 more,用 for 好了。


@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 ]

   此帖被 +2 点积分    点击查看详情   
评分人:【 HAT 分数: +2  时间:2008-11-11 12:13


2008-11-11 01:22
查看资料  发短消息 网志   编辑帖子  回复  引用回复
lsjiang
新手上路





积分 17
发帖 16
注册 2008-11-7
状态 离线
『第 29 楼』:  

这样就没有什么问题了。非常感谢!

2008-11-11 11:33
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
« [1] [2] »
请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题



论坛跳转: