我有一个 .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 文件名