0

我有一个 .cmd 批处理文件(我们称之为 RunSQlCmd.cmd),它将 sqlcmd 的输出通过管道输出到 7 zip 压缩器

sqlcmd -i.\table.sql -S . -E -s "," -I -h -1 -W| "c:\Program Files\7-Zip\7z.exe" a -tbzip2 -si "out.csv.bz2"

我使用以下命令行从 C# 驱动程序的任务中从 Azure Batch 运行它

(1)cmd /c %AZ_BATCH_NODE_SHARED_DIR%\RunSqlCmd.cmd

但似乎发生的是命令行几乎立即返回,并且 RunSqlCmd.cmd 中的命令没有完全执行,并且创建了空的压缩存档。Azure Batch 任务以成功代码 0 退出。

如果我将任务的命令行更改为

(2)cmd /c start /wait %AZ_BATCH_NODE_SHARED_DIR%\RunSqlCmd.cmd

批处理文件中的命令成功运行,但 Azure Batch 的 stdout 和 stderr 丢失,因为批处理文件在单独的 cmd 窗口中运行并且任务挂起而没有收到任何错误代码。

将任务的命令行更改为

(3)cmd /c start /B /wait %AZ_BATCH_NODE_SHARED_DIR%\RunSqlCmd.cmd

类似于 (1)

什么是正确的方法,以便 Azure Batch 在任务完成并且 RunSqlCmd.cmd 命令完全完成时正确检测?

PS RunSqlCmd.cmd 文件的真实内容为 @echo Run SqlCmd sqlcmd -i "%~dp0%1.sql" -d dbName -S serverName -U userName -P "password" -s "," -I -h -1 -W -b | "%ProgramFiles%\7-Zip\7z.exe" a -tbzip2 -si "%~dp0%1.csv.bz2" @echo Done SqlCmd

需要 1 个参数 - 提取数据的 sql 文件名

4

1 回答 1

1

我不太明白您为什么要运行cmd /cstart /wait启动程序。您不需要从开始调用 cmd.exe,也不需要调用 cmd 来启动批处理文件。

如果是批处理文件,你可以直接调用批处理文件。它会在内部自动等待命令完成。

%AZ_BATCH_NODE_SHARED_DIR%\RunSqlCmd.cmd

这应该可以按原样工作,而无需再次调用 start 或 cmd 。

主要问题是您将带有引号参数的命令发送到外部程序,因此您再次调用 cmd 并将命令发送到此 cmd 窗口并在发送到外部时去掉引号。只需按原样调用脚本即可。

于 2017-05-29T09:19:35.203 回答