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