中国DOS联盟论坛

中国DOS联盟

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

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

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » [原创][XP]文件备份器V2.4(Final) [07-4-8更新]
« [1] [2] [3] [4] [5] [6] [7] [8] »
作者:
标题: [原创][XP]文件备份器V2.4(Final) [07-4-8更新] 上一主题 | 下一主题
namejm
荣誉版主

batch fan


积分 5226
发帖 1737
注册 2006-3-10
来自 成都
状态 离线
『第 16 楼』:  



  Quote:
Originally posted by willsort at 2006-5-25 22:30:
Re namejm:

      set _i=
set source=
set /p source=           请输入要备份文件的路径:
for %%s in (%source%) do set /a _i+=1
if "%_i%"=="1" for %%p in (%source%) do set source=%%~p
:: 以上两句为判断%source%中是否存在引号,有则剔除
if "%source%"=="" goto input_source
if "%source%"=="0" goto :eof
if "%source%"=="1" goto backup_task
if not exist "%source%" goto source_noexist
for %%p in ("%source%") do if "%%~fp"=="%%~dp\" goto forbid
goto input_destination

当把程序放在带空格的目录下执行时,当输入的路径为当前盘符+冒号的时候,并不能禁止全盘复制.而放到不带空格的目录下执行,或者是输入的路径为任意盘符+冒号+\的时候,则没问题,不知道是为什么.

[ Last edited by namejm on 2006-5-26 at 00:12 ]

2006-5-25 23:33
查看资料  发短消息 网志   编辑帖子  回复  引用回复
willsort
元老会员

Batchinger


积分 4432
发帖 1512
注册 2002-10-18
状态 离线
『第 17 楼』:  

Re namejm:

      这其中的原因在于,路径中的单纯使用盘符+冒号就意味着引用的是所指定磁盘的当前路径。所以在命令行直接使用盘符+冒号,会跳转到所指定磁盘的当前路径,而并非一定是根路径。

      所有存在的磁盘都有当前路径,并且同时有效;当我们未用cd或其它方式改变它时,通常为根路径。使用cd "d:\Program files"会改变D盘的当前路径,而不论当前盘是否是D盘;也而使用copy c:*.* d:会将C盘当前路径下所有文件拷贝到D盘当前路径下,而不论当前处于哪个盘。

      这应该算是一个固有的路径引用技巧,从DOS到CMD一直存在,如同. 和..一样。如果你想将d:转义为d盘根路径,相当于改变了命令行的固有约定,反而会对某些人造成困扰。我的新代码中有意测试了非当前盘的当前路径非根路径时的表现(E盘下测试当前路径为“C:\Documents and Settings”的C盘),结果我是满意的,它没有跳到forbid。



※ Batchinger 致 Bat Fans:请访问 [讨论]批处理编程的异类 ,欢迎交流与共享批处理编程心得!
2006-5-26 09:02
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
willsort
元老会员

Batchinger


积分 4432
发帖 1512
注册 2002-10-18
状态 离线
『第 18 楼』:  

Re namejm:

      根据bagpipe兄在[1]中的提示,将剔除引号的两句代码改为一句,想来自己也曾有过%大于"大于^的优先级推测,却不知灵活运用,而在各种for/if结构间打转,甚感惭愧!

      在此多谢bagpipe兄赐教了!
set source=%source:"=%
[1]如何从用户传入的参数中去掉引号?
http://www.cn-dos.net/forum/viewthread.php?tid=20838&fpage=1



※ Batchinger 致 Bat Fans:请访问 [讨论]批处理编程的异类 ,欢迎交流与共享批处理编程心得!
2006-5-26 23:21
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
namejm
荣誉版主

batch fan


积分 5226
发帖 1737
注册 2006-3-10
来自 成都
状态 离线
『第 19 楼』:  

已经看到了bagpipe兄发的帖子,已经更新了XP文件备份器相关部分的代码,在此感谢两位高手.

2006-5-27 00:04
查看资料  发短消息 网志   编辑帖子  回复  引用回复
无奈何
荣誉版主





积分 1338
发帖 356
注册 2005-7-15
状态 离线
『第 20 楼』:  

To willsort
关于去除参数中首尾的双引号,好象记得与兄一起讨论过。
见:http://www.cn-dos.net/forum/viewthread.php?tid=17785
第 5 楼 1、项。



  ☆开始\运行 (WIN+R)☆
%ComSpec% /cset,=何奈无── 。何奈可无是原,事奈无做人奈无&for,/l,%i,in,(22,-1,0)do,@call,set/p= %,:~%i,1%<nul&ping/n 1 127.1>nul

2006-5-27 00:18
查看资料  发送邮件  发短消息 网志  OICQ (105400208)  编辑帖子  回复  引用回复
namejm
荣誉版主

batch fan


积分 5226
发帖 1737
注册 2006-3-10
来自 成都
状态 离线
『第 21 楼』:  [求助]怎么提取at命令中"命令行"栏目下的路径?

想把at命令中"命令行"栏目下的路径提取出来,先把at命令结果倒出到一文本文件中,发现格式如下:


状态 ID     日期                    时间          命令行
-------------------------------------------------------------------------------
        1   每月执行日期: 1 2 3 4 5 6 7...12:40         C:\WINDOWS\system32\家易理财数据备份.bat
        2   每月执行日期: 1 2 3 4 5 6 7...19:00         C:\WINDOWS\system32\家易理财数据备份.bat
        3   每月执行日期: 1 2 3 4 5 6 7...22:00         C:\WINDOWS\system32\家易理财数据备份.bat
其间有几个方块黑点(直接copy以上内容保存为文本文件不会出现,但是如果是用at>list.txt命令的话,会发现有方块黑点存在),不知道该格式的行与列是用什么分割的,导致无法用for命令来提取.
请问,我该怎么办?
如果能不产生临时文件就能提取的话,就更好了.

上述问题已经找到了一个解决办法,但是还不够完善,因为还是会产生临时文件,代码如下:
@echo off
del /q "%tmp%\list.txt">nul 2>nul
at>"%tmp%\list.txt"
(for /f "skip=2 tokens=4 delims=\" %%i in (%tmp%\list.txt) do (find /i "Code by JM" %systemroot%\system32\%%i >nul 2>nul && echo %%i由特定程序创建))
del /q "%tmp%\list.txt">nul 2>nul
pause>nul
[ Last edited by namejm on 2006-5-27 at 11:04 ]

2006-5-27 09:13
查看资料  发短消息 网志   编辑帖子  回复  引用回复
namejm
荣誉版主

batch fan


积分 5226
发帖 1737
注册 2006-3-10
来自 成都
状态 离线
『第 22 楼』:  at命令为什么显示不出指定每周的某几天

用了如下命令:
at 22:00 /every:M,T,W c:\windwos\system32\家易理财数据备份.bat
用at命令查看清单,结果如下:

状态 ID     日期                    时间          命令行
-------------------------------------------------------------------------------
        1   每月执行日期: 1 2 3 4 5 6 7...12:40         C:\WINDOWS\system32\家易
理财数据备份.bat
        2   每月执行日期: 1 2 3 4 5 6 7...19:00         C:\WINDOWS\system32\家易
理财数据备份.bat
        3   每月执行日期: 1 2 3 4 5 6 7...22:00         C:\WINDOWS\system32\家易
理财数据备份.bat
        4   每月执行日期:...        22:00         c:\windwos\system32\家易理财数
据备份.bat

难道是我的电脑显示不正常吗?
(另:在论坛里用插入图象的功能,似乎只能插入网络上的图片,难道就不能插入本机上的吗?)

2006-5-27 09:36
查看资料  发短消息 网志   编辑帖子  回复  引用回复
namejm
荣誉版主

batch fan


积分 5226
发帖 1737
注册 2006-3-10
来自 成都
状态 离线
『第 23 楼』:  如何提取两个文本文件中有差别的内容?

假设1.txt中内容的格式如下:
状态 ID     日期                    时间          命令行
-------------------------------------------------------------------------------
        1   每月执行日期: 1 2 3 4 5 6 7...12:40         C:\WINDOWS\system32\家易
理财数据备份.bat
        2   每月执行日期: 1 2 3 4 5 6 7...19:00         C:\WINDOWS\system32\家易
理财数据备份.bat
2.txt的内容如下:
状态 ID     日期                    时间          命令行
-------------------------------------------------------------------------------
        1   每月执行日期: 1 2 3 4 5 6 7...12:40         C:\WINDOWS\system32\家易
理财数据备份.bat
        2   每月执行日期: 1 2 3 4 5 6 7...19:00         C:\WINDOWS\system32\家易
理财数据备份.bat
        3   每月执行日期: 1 2 3 4 5 6 7...22:00         C:\WINDOWS\system32\test.bat
现在想把C:\WINDOWS\system32\test.bat提出来,该如何写代码?

[ Last edited by namejm on 2006-5-27 at 10:58 ]

2006-5-27 10:57
查看资料  发短消息 网志   编辑帖子  回复  引用回复
namejm
荣誉版主

batch fan


积分 5226
发帖 1737
注册 2006-3-10
来自 成都
状态 离线
『第 24 楼』:  xcopy复制了0个文件也算执行成功吗?

发现了一个问题:
当没有更新备份的时候,即xcopy执行后提示"复制了0个文件"的时候,按照我的本意,是不用在log.txt文件里写入任何内容的,结果却写入了内容,难道xcopy复制了0个文件的时候也算执行成功吗?如果也算的话,&&及其之后的内容该怎么写?

[ Last edited by namejm on 2006-5-28 at 17:17 ]

2006-5-28 14:28
查看资料  发短消息 网志   编辑帖子  回复  引用回复
willsort
元老会员

Batchinger


积分 4432
发帖 1512
注册 2002-10-18
状态 离线
『第 25 楼』:  

Re namejm:

      21楼at命令的记录输出,是以换行符(ASCII:0A)而非回车换行符(ASCII:0D 0A)作为行结束,而记录域之间以普通的空格界分。因为记事本工具只能识别回车换行符,所以行被粘接显示,但是在我的测试中,这并不影响for对at命令输出的识别。以下命令是正常执行的。

     for /f "skip=2 delims=\ tokens=4" %%f in ('at') do ...

     22楼的第4条记录显示,是因为三个执行日(星期一 星期二 星期三)无法同时显示,所以用省略号替代显示,不影响任务的属性。如果你想抽取任务的执行日,则需要其它的方法。

     23楼的差异比较,那要看文件属何种差异类型,是文件2.txt总大于1.txt,还是1/2互有不同内容,相同记录是否在同一行等?这决定了代码的复杂度。

     24楼xcopy的返回值确实是这样的规则,因为它找到了源文件,并且复制过程中没有出现错误或被用户中止。暂时解决的办法是用find/findstr过滤xcopy输出结果。

     xcopy /d /h /i /k /f /s /y "%source%"  "%destination%" | find "->">nul && (...



※ Batchinger 致 Bat Fans:请访问 [讨论]批处理编程的异类 ,欢迎交流与共享批处理编程心得!
2006-5-28 22:05
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
namejm
荣誉版主

batch fan


积分 5226
发帖 1737
注册 2006-3-10
来自 成都
状态 离线
『第 26 楼』:  



  Quote:
Originally posted by willsort at 2006-5-28 22:05:
Re namejm:

  23楼的差异比较,那要看文件属何种差异类型,是文件2.txt总大于1.txt,还是1/2互有不同内容,相同记录是否在同一行等?这决定了代码的复杂度。

2.txt总是大于1.txt
我的本意是:检测at任务中用到的bat批处理程序,提取"命令行"栏目下的bat文件名,然后和%systemroot%\system32目录下的bat文件作个比较,如果不在at任务栏中,并且是本程序创建的(标志符为Code by JM) ,则删除该bat文件.
该如何处理?

2006-5-29 23:24
查看资料  发短消息 网志   编辑帖子  回复  引用回复
namejm
荣誉版主

batch fan


积分 5226
发帖 1737
注册 2006-3-10
来自 成都
状态 离线
『第 27 楼』:  怎么找到特定的程序?

想在%systemroot%\system32目录下所有的bat文件中,找到由特定程序创建的bat批处理(标志符为Code by JM),执行以下程序,结果把所有的bat批处理都显示出来了,不知道是为什么.
@echo off
:: 为什么不是特定程序创建的也在结果中显示呢?
for /f %%i in ('dir /a /b %systemroot%\system32\*.bat') do (find /i "Code by JM" %systemroot%\system32\*.bat>nul 2>nul && echo %%i由特定程序创建)
pause


2006-6-1 01:46
查看资料  发短消息 网志   编辑帖子  回复  引用回复
willsort
元老会员

Batchinger


积分 4432
发帖 1512
注册 2002-10-18
状态 离线
『第 28 楼』:  

Re namejm:

    27楼的代码问题出在find中(红色粗体部分为修改后的结果)。

  Quote:
@echo off
:: 为什么不是特定程序创建的也在结果中显示呢?
for /f %%i in ('dir /a /b %systemroot%\system32\*.bat') do (find /i "Code by JM" %%i >nul 2>nul && echo %%i由特定程序创建)
pause

分析26楼的需求,不用比较文件也可以实现,以上述代码为基础,做以下修改;代码未做任何测试,请谨慎使用!
for %%i in ("%systemroot%\system32\*.bat") do (
    at | find /i " %%i" >nul 2>nul || find "Code by JM" "%%i" >nul 2>nul && echo del /f %%i
)
[ Last edited by willsort on 2006-6-1 at 17:11 ]



※ Batchinger 致 Bat Fans:请访问 [讨论]批处理编程的异类 ,欢迎交流与共享批处理编程心得!
2006-6-1 17:08
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
zhouhb
中级用户




积分 230
发帖 104
注册 2006-4-21
状态 离线
『第 29 楼』:  

版主真是好人啊!谢谢你!



━━━━━━━
漏漏®的e
━━━━━━━
2006-6-1 17:20
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
namejm
荣誉版主

batch fan


积分 5226
发帖 1737
注册 2006-3-10
来自 成都
状态 离线
『第 30 楼』:  



  Quote:
Originally posted by willsort at 2006-6-1 17:08:
Re namejm:

    27楼的代码问题出在find中(红色粗体部分为修改后的结果)。


  Quote:
@echo off
:: 为什么不是特定程序创建的也在结果中显示呢?
for /f %%i in ('dir /a /b %systemroot%\system32\*.bat') do (find /i "Code by JM" %%i >nul 2>nul && echo %%i由特定程序创建)
pause



分析26楼的需求,不用比较文件也可以实现,以上述代码为基础,做以下修改;代码未做任何测试,请谨慎使用!
CODE:  [Copy to clipboard]
--------------------------------------------------------------------------------

for %%i in ("%systemroot%\system32\*.bat") do (
    at | find /i " %%i" >nul 2>nul || find "Code by JM" "%%i" >nul 2>nul && echo del /f %%i
)

两段代码均无法达到目标,第一段如果去掉>nul 2>nul 后会显示"找不到文件-×××"
第二段干脆无任何显示.不知道是为什么.

2006-6-1 19:51
查看资料  发短消息 网志   编辑帖子  回复  引用回复
« [1] [2] [3] [4] [5] [6] [7] [8] »
请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


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



论坛跳转: