有2个文件:file1.bat,file2.cmd
file1.bat通过命令调用file2.cmd:
db2cmd -i -c -w db2 !call file2 parm1 parm2
此命令在同一窗口打开一个DB2命令窗口并调用file2.cmd
但是,我不明白的是'!'的功能。在“通话”前面。
file2.cmd具有以下功能:
1. DB connection: db2 connect to dbname user username using psw
2. File open: for /F "delims=;" %%i in (input.txt) do (do something)
如果传递了错误的参数,
---------在file1命令中使用“ call”,错误显示:
SQL1024N A database connection does not exist. SQLSTATE=08003
---------在file1命令中使用'!call',错误显示:
SQL1001N "xxx" is not a valid database name. SQLSTATE=2E000
The system cannot find the file \input.txt.
DB20000I The TERMINATE command completed successfully
因此,看起来像“调用”会调用另一个文件并在命令之一失败后中断高级错误消息;
当“!call”调用另一个文件并继续运行内部所有命令时,即使有错误,也将显示所有失败的所有错误消息。
有人可以建议'call'和'!call'之间的区别吗?
答案 0 :(得分:1)
好吧,简而言之,批处理/ cmdline中没有功能!call
。因此db2cmd.exe
本身就是命令行处理器,要求您将系统命令与前面的!
因此,尽管您有一个运行带有参数的命令的批处理文件,但实际上是这样。您正在从此cmd开始db2cmd
,然后它要求您调用另一个批处理文件,但由于我们不再位于cmd的外壳之内,而是看到db2cmd
的内部,因此您需要告诉db2cmd
表示您正在通过执行!call
您可以通过在自己的db2cmd
上进行测试来进行测试,在该提示下会出现db2=>
提示,然后从那里尝试使用call
与!call
。
关于您的错误消息:
SQL1001N "xxx" is not a valid database name. SQLSTATE=2E000
The system cannot find the file \input.txt.
DB20000I The TERMINATE command completed successfully
尝试为input.txt
文件添加路径
for /F "delims=;" %%i in (C:\somepath\input.txt) do (
something
)
或将input.txt
放在您的工作目录中。
答案 1 :(得分:1)
有一种更简便的方法来处理Windows批处理文件中正在运行的Db2 CLP命令。
Windows上的Db2要求Db2 CLP命令在db2cmd.exe窗口中运行。 (否则,普通cmd.exe窗口中的db2命令可能会因错误而失败)。 db2cmd.exe随Windows的Db2客户端一起提供。
解决方案是安排脚本自动检测它是否正在运行 在db2cmd.exe中运行,如果没有运行,则在db2cmd下运行自己。
通过这种方法,调用脚本(如果有) 可以只包含“ call file2.bat par1 parm2”,并且可以由普通的CMD.EXE执行, 而“ file2.bat”则可以包含:
@set db2cmd="C:\Program Files\IBM\SQLLIB\BIN\db2cmd.exe"
@if "%DB2CLP%"=="" %db2cmd% /w /c /i "%0" %* && @goto :EOF
@rem If db2cmd.exe is on the system PATH then you can omit the set db2cmd line.
db2 connect to dbname user username using psw
...rest of script...
...you can use db2 CLP commands directly
第一行设置一个变量,以包含db2cmd.exe可执行文件的标准路径名。这是默认路径,因此您可能需要更改路径名以匹配您的环境,如果您确定db2cmd.exe始终位于系统路径上,则可以忽略此路径。
第二行测试脚本是否在db2cmd.exe下运行(在这种情况下为DB2CLP环境) 变量将被设置)。如果该脚本不是在db2cmd.exe下运行的,则该脚本将自行运行 在db2cmd.exe下传递相同的命令行参数。如果该脚本已经在db2cmd.exe下运行,则继续下一行。