Board logo

标题: 在批处理中引用变量出现的问题,请大家出出主意! [打印本页]

作者: remuzi     时间: 2006-1-6 19:03    标题: 在批处理中引用变量出现的问题,请大家出出主意!

我用每天的日期做文件名来备份数据库,但LOG文件不可用变量,不知是什么原因,代码如下,请高手指点:
@echo off
date/t | exp test/test@emis owner=test file=f:\%1.dmp log=f:\%1.log
if errorlevel = 0 (exit) else (start err.exe)
这样会出错误,但在改了.log文件名固定的后,如:log=f:\exp.log,就不会有问题,但我想每天生成一个数据库文件和LOG文件,这样我在恢复某天的数据时就可以查到当天的数据库是否有问题。而且errorlevel检查不到是否出错,都是直接退出的。
作者: willsort     时间: 2006-1-7 10:00
Re remuzi:

      你的代码由如下问题:

      1、 f:\%1.dmp 与 f:\%1.log ,%1 意味着引用调用批处理的命令行的第一个参数,而它很可能为空,这样上面的引用就成了 f:\.dmp 和 f:\.log ,当然是很可能出错的。

      而从实际代码来看,你试图利用 date/t 从管道中获取日期,这样是比较困难的,因为 DOS 或者 Windows 命令行不会将管道中的信息传送给 exp 的命令行,而会直接传送到的它的输入端。

      在这里,如果要在文件名中使用日期一般通过环境变量来实现。在 NT
系列的 cmd 中,直接引用 %date% 变量便可得到日期,还可通过 %date:~0,10% 等形式对日期内容进行修剪。在DOS或9x的command中,需要先通过date或者prompt将日期值设置到环境变量中再行引用,细节在 [分享]批处理编程的异类(http://www.cn-dos.net/forum/viewthread.php?tid=8905) 可以找到,不再详述。

      2、errorlevel检查不到是否出错,是你的用法有误。在DOS或者命令行中的命令语法,if errorlevel 对后面的数值判断是大于等于,而非等于,即使你在 errrorlevel 后使用了 = 或者 == 。对于此种情况,你可以使用 if  %errorlevel% EQU 1 (exit) else (start err.exe) 。或者在 DOS/Win9x 下,可以使用:

if not errorlevel 1 exit
start err.exe