Windows批处理中!call和call有什么区别

时间:2019-03-06 06:51:44

标签: windows batch-file db2

有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'之间的区别吗?

2 个答案:

答案 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下运行,则继续下一行。