В чем разница между! Звонить и звонить в windows batch - PullRequest
1 голос
/ 06 марта 2019

Есть 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)

Если передать неверные параметры,
--------- С помощью 'call' в команде file1, ошибкапоказывает:

SQL1024N  A database connection does not exist.  SQLSTATE=08003 

--------- С '! call' в команде file1, ошибка показывает:

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' вызывает другой файл и продолжает выполнение всех внутренних команд, даже если есть ошибки, затем отображаются все сообщения об ошибках всехпровал.

Может кто-нибудь посоветовать разницу между «звонить» и «! Звонить»?

Ответы [ 2 ]

1 голос
/ 06 марта 2019

Существует более простой способ обработки команд CLP Db2 внутри пакетного файла Windows.

Db2 в Windows требует, чтобы команды Db2 CLP выполнялись внутри окна db2cmd.exe. (в противном случае команда db2 в обычном окне cmd.exe может завершиться ошибкой). Db2cmd.exe поставляется с клиентом Db2 для Windows.

Решение состоит в том, чтобы скрипт автоматически обнаруживал, запущен ли он внутри 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, перейдите к следующей строке.

1 голос
/ 06 марта 2019

Хорошо, проще говоря, в пакете / cmdline нет функции !call.Таким образом, db2cmd.exe, являющийся самим процессором командной строки, требует, чтобы вы использовали системные команды с предшествующим !

Так что, хотя у вас есть командный файл, который запускает команду с параметрами, фактически это то, что происходит.Вы запускаете db2cmd из этого cmd, затем он требует, чтобы вы вызвали другой пакетный файл, но, видя, что мы больше не в оболочке cmd, а вместо этого внутри db2cmd, вы должны сообщить db2cmd, чтоэто системная команда, которую вы выполняете, выполняя !call

. Вы можете протестировать ее, выполнив сам db2cmd, где вы получите приглашение db2=>, а затем попытайтесь использовать callvs !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 в вашем рабочем каталоге.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...