中国DOS联盟

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

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

中国DOS联盟论坛
现在时间是 2026-06-30 00:52
中国DOS联盟论坛 » DOS疑难解答 & 问题讨论 (解答室) » 自动建立日期为名的目录备份数据 查看 758 回复 7
楼 主 自动建立日期为名的目录备份数据 发表于 2006-03-09 00:41 ·  中国 湖北 武汉 电信
初级用户
积分 40
发帖 18
注册 2006-02-22 22:33
20年会员
UID 50796
状态 离线
要在win2000server下,用启动脚本自动在每天启动时建立日期为名的目录,并在此目录下备份数据。批处理内容如下:
if not exist %date:~4% md %date:~4% & xcopy /e x:\*.* %date:~4%\ & echo %date:~4% %time%备份数据成功 >> log.txt
证明可以完成任务。但改写成:
if not exist %date:~4% md %date:~4% & xcopy /e x:\*.* %date:~4%\ else echo %date:~4% %time%备份数据失败 >> log.txt
则批处理无法正常运行。请大家帮我看一下,问题出在哪儿?怎么解决?
2 发表于 2006-03-09 01:39 ·  中国 湖北 荆门 电信
荣誉版主
★★★
积分 2,013
发帖 718
注册 2006-02-18 07:07
20年会员
UID 50550
状态 离线
没事多看看 帮助与支持 了
if not exist (%date:~4% md %date:~4% & xcopy /e x:\*.* %date:~4%\) else echo %date:~4% %time%备份数据失败 >> log.txt
加个括号看看,我记得以前碰到过这种情况
另:建议用 && 而不是用 & ,不用else改用 || ,写成
if not exist %date:~4% md %date:~4% && xcopy /e x:\*.* %date:~4%\ || echo %date:~4% %time%备份数据失败 >> log.txt
以上代码均未测试,如果有错误勿怪。
3 还是不行? 发表于 2006-03-09 21:15 ·  中国 湖北 武汉 电信
初级用户
积分 40
发帖 18
注册 2006-02-22 22:33
20年会员
UID 50796
状态 离线
谢谢兄弟。
不过,这两种修改还是不行。如果改用这种方式:
Subst x: c:\PROGRA~1\zhou
d:
cd \wubozh
if not exist %date:~4% goto back
echo %date:~4% %time% 备份数据失败!!!目录已经存在,或者今天已经做过备份?>> log.txt
goto exit
:back
md %date:~4%
xcopy /e x:\*.* %date:~4%\
echo %date:~4% %time% 备份数据成功 >> log.txt
goto exit
:exit
subst x: /d
经验证是可以的。但不知为什么上面的改法会失败?看来我要从头来看看批处理的基础教程才行。
4 发表于 2006-03-09 22:19 ·  中国 山西 运城 中移铁通
元老会员
★★★★
Batchinger
积分 4,432
发帖 1,512
注册 2002-10-18 00:00
23年会员
UID 19
性别 男
状态 离线
Re wubozh:

3742668 兄的第一段代码括号加错了地方:

if not exist %date:~4% (md %date:~4% & xcopy /e x:\*.* %date:~4%\) else echo %date:~4% %time%备份数据失败 >> log.txt

而 || 在这里并不使用,3742668 兄的第二段代码意味着,在 md 和 xcopy 中任一命令返回错误的 1 时才执行 echo,而非在 if not exist 返回 1 时执行。

另外,xcopy 会自动创建不存在的目标目录,同时,它的开关 /d 可以选择更新比目标新的源文件。


if not exist %date:~4\nul (xcopy /d /e x:\*.* %date:~4%\ >nul 2>nul && echo %date:~4% %time% 备份数据成功>> log.txt || echo %date:~4% %time% 备份数据失败>> log.txt) else (echo %date:~4% %time% 目录已经存在>> log.txt)
※ Batchinger 致 Bat Fans:请访问 批处理编程的异类 ,欢迎交流与共享批处理编程心得!
5 还是没弄懂 发表于 2006-03-09 22:36 ·  中国 湖北 武汉 电信
初级用户
积分 40
发帖 18
注册 2006-02-22 22:33
20年会员
UID 50796
状态 离线
还是没弄懂啊。我最先的那句批处理为什么不能正确执行呢?
6 发表于 2006-03-09 22:55 ·  中国 湖北 荆门 电信
荣誉版主
★★★
积分 2,013
发帖 718
注册 2006-02-18 07:07
20年会员
UID 50550
状态 离线
呵呵,不好意思,当时回贴的时候准备去睡觉了
所以难免出错,见谅。
第一个错误那是笔误,第二个是没有实践,凭空写的,原因在于本人没用过XCOPY,而解决这一类问题的我的通常做法就是用||。
LZ你出错的地方在于:
在命令行中,else 子句必须出现在与 if 后的命令相同的行中,你的那种写法其实else子句被解释为前面命令的参数,你需要先结束前面的子句:md %date:~4% & xcopy /e x:\*.* %date:~4%\再接else子句。
7 谢谢 发表于 2006-03-10 21:49 ·  中国 湖北 武汉 电信
初级用户
积分 40
发帖 18
注册 2006-02-22 22:33
20年会员
UID 50796
状态 离线
谢谢。果真如此。很怪了,我当时在win2000的命令行窗口查if命令的帮助,它让我用的是<>,而不是()。不然就不会走这么多的弯路了。不过也好,多学了些东西。
8 看错了 发表于 2006-03-10 21:50 ·  中国 湖北 武汉 电信
初级用户
积分 40
发帖 18
注册 2006-02-22 22:33
20年会员
UID 50796
状态 离线
刚才又进2000的命令行去看了一下。看错了。确实是()。不过它写的和<>差不多。真要命
论坛跳转: