中国DOS联盟

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

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

中国DOS联盟论坛
现在时间是 2026-08-10 07:57
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » [已结]如何根据文 本 文 件的内容拷贝数据 查看 2,262 回复 28
楼 主 [已结]如何根据文 本 文 件的内容拷贝数据 发表于 2008-11-07 23:54 ·  中国 北京 昌平区 联通
新手上路
积分 17
发帖 16
注册 2008-11-07 22:59
17年会员
UID 130332
性别 男
状态 离线
详细内容:
根据文本文件的路径及文件名拷贝文件到指定路径下,并在该路径下建立相同的路径.例如:文本文件 a.txt 内容如下:

e:\book\abc\sample1.pdf
e:\book\abc\sample2.pdf
e:\book\abc\sample3.pdf

想拷贝sample1.pdf、sample2.pdf、sample3.pdf 到 f盘 ,并在f盘得到与e盘相同的目录结构:首先判断f盘中有没有book文件夹,如果没有则建一个book文件夹,然后再判断book有没有abc文件夹,如果没有则建一个abc文件夹,最后把三个文件拷贝到该文件夹中。
请教各位大侠,用批处理的方式能不能实现,多谢!

[ Last edited by lsjiang on 2008-11-13 at 17:14 ]
2 发表于 2008-11-08 00:54 ·  中国 北京 昌平区 联通
新手上路
积分 17
发帖 16
注册 2008-11-07 22:59
17年会员
UID 130332
性别 男
状态 离线
请大侠们费费心,多谢了!
3 发表于 2008-11-08 01:02 ·  中国 江西 赣州 安远县 电信
银牌会员
★★★★
积分 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"
copy /y "%%a" "F:%%~pa"
)
本帖最近评分记录 (共 1 条) 点击查看详情
评分人分数时间
HAT +2 2008-11-08 11:13
4 发表于 2008-11-08 07:26 ·  中国 北京 昌平区 联通
新手上路
积分 17
发帖 16
注册 2008-11-07 22:59
17年会员
UID 130332
性别 男
状态 离线
测试通过,完全实现所需功能!
非常感谢tireless!
5 发表于 2008-11-08 08:53 ·  中国 北京 昌平区 联通
新手上路
积分 17
发帖 16
注册 2008-11-07 22:59
17年会员
UID 130332
性别 男
状态 离线
补充求助:
能不能在批处理中同时实现把文本文件a.txt中已拷贝的文件行删除?
6 发表于 2008-11-08 09:58 ·  中国 江西 赣州 电信
银牌会员
★★★★
积分 2,025
发帖 1,122
注册 2007-09-05 20:15
18年会员
UID 96653
性别 男
状态 离线
Originally posted by lsjiang at 2008-11-8 08:53 AM:
补充求助:
能不能在批处理中同时实现把文本文件a.txt中已拷贝的文件行删除?

也就是说 a.txt 列表中的有些文件是不存在的是吗?将不存在的路径保存到 b.txt:

@echo off
for /f "delims=" %%a in (a.txt) do (
if not exist "F:%%~pa" md "F:%%~pa"
copy /y "%%a" "F:%%~pa" >nul || >>b.txt echo %%a
)
7 发表于 2008-11-08 10:44 ·  中国 北京 昌平区 联通
新手上路
积分 17
发帖 16
注册 2008-11-07 22:59
17年会员
UID 130332
性别 男
状态 离线
首先感谢tireless的不吝赐教!
补充中的意思也可以这样理解:把a.txt中已经拷贝完成的行删除!
是不是可以这样处理:把已经拷贝完成的文件夹及文件列出一个完整目录到另外一个文件文件b.txt中,然后比较a.txt和b.txt,从a.txt删除b.txt中有的行?(假设同一行中后面15个字符相同就视为此行相同)
我是新手,不知道用批处理能不能实现这样的功能?

[ Last edited by lsjiang on 2008-11-8 at 10:55 ]
8 Re 7 楼 发表于 2008-11-08 11:02 ·  中国 江西 赣州 电信
银牌会员
★★★★
积分 2,025
发帖 1,122
注册 2007-09-05 20:15
18年会员
UID 96653
性别 男
状态 离线
6 楼的代码不行么?
9 发表于 2008-11-08 11:25 ·  中国 北京 昌平区 联通
新手上路
积分 17
发帖 16
注册 2008-11-07 22:59
17年会员
UID 130332
性别 男
状态 离线
6楼的代码基本能实现所需目标,再请教一个问题:如果目标盘F盘空间不足的话,6楼的代码能正常执行吗?
10 Re 9 楼 发表于 2008-11-08 11:27 ·  中国 江西 赣州 电信
银牌会员
★★★★
积分 2,025
发帖 1,122
注册 2007-09-05 20:15
18年会员
UID 96653
性别 男
状态 离线
不行的吧
11 发表于 2008-11-08 11:57 ·  中国 北京 昌平区 联通
新手上路
积分 17
发帖 16
注册 2008-11-07 22:59
17年会员
UID 130332
性别 男
状态 离线
空间不足,拷贝不成功,会报错退出呢,还是能够继续执行“|| >>b.txt echo %%a”,把没有执行成功的部分输出到b.txt中呢?
12 发表于 2008-11-08 13:32 ·  中国 江西 赣州 电信
银牌会员
★★★★
积分 2,025
发帖 1,122
注册 2007-09-05 20:15
18年会员
UID 96653
性别 男
状态 离线
Originally posted by lsjiang at 2008-11-8 11:57 AM:
空间不足,拷贝不成功,会报错退出呢,还是能够继续执行“|| >>b.txt echo %%a”,把没有执行成功的部分输出到b.txt中呢?

应该是会把没有执行成功的部分输出到b.txt中。你自己测试吧,把一个盘的空间填满,然后... ...我的256MB内存的机器就不做测试了。

[ Last edited by tireless on 2008-11-8 at 13:34 ]
13 发表于 2008-11-08 14:59 ·  中国 北京 昌平区 联通
新手上路
积分 17
发帖 16
注册 2008-11-07 22:59
17年会员
UID 130332
性别 男
状态 离线
已经过测试:会把没有执行成功的部分输出到b.txt中,只是会显示很多“磁盘空间不足”的提示,直到把所有没拷贝成功的行都显示一遍才会执行后面的命令。
请问:如果a.txt文件中行数很多的话,显示时间会较长,如何在第一个“磁盘空间不足”的提示后即停止拷贝,执行后面的输出命令?
麻烦了,再次表示感谢!
14 Re 13 楼 发表于 2008-11-08 15:45 ·  中国 江西 赣州 电信
银牌会员
★★★★
积分 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 || pause & exit /b
)
15 发表于 2008-11-08 16:20 ·  中国 北京 昌平区 联通
新手上路
积分 17
发帖 16
注册 2008-11-07 22:59
17年会员
UID 130332
性别 男
状态 离线
14楼的代码运行不成功,没有创建b.txt。可能是我没表达清楚。

6楼的代码已经基本能够达到目标,有个问题是在磁盘空间不足的情况下,一定要等到a.txt中所有行都执行完后才能进行输出动作,如果手动结束的话,后面的命令不执行就得不到b.txt。
我的意思是在在磁盘空间不足的情况下直接结束拷贝动作,并将没有成功拷贝的行输出到b.txt。

另外:if not exist "%%a" (>>b.txt echo %%a) 这句的意思没看明白,麻烦帮解释一下。谢谢

[ Last edited by lsjiang on 2008-11-8 at 16:29 ]
论坛跳转: