2017-05-29 89 views
0

我有一个.cmd批处理文件(让我们称之为RunSQlCmd.cmd),该管道从SQLCMD的输出至7拉链压缩机管道输出未检测

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

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

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

但是,似乎发生的是命令行几乎立即返回,并在RunSqlCmd.cmd命令不可完全执行并抢占y压缩存档被创建。 Azure的批处理任务的成功代码0

退出。如果我的任务的命令行更改为

(2)在批处理文件运行cmd /c start /wait %AZ_BATCH_NODE_SHARED_DIR%\RunSqlCmd.cmd

命令成功,但由于输出和错误丢失了Azure的批次批量文件在单独的cmd窗口中运行,并且任务挂起而不会收到任何错误代码。

改变任务的命令行

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

类似于(1)

是什么让Azure的批量当任务完成正确检测做了正确的方式RunSqlCmd.cmd命令完成完成?

P.S. 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文件的名称来提取数据

+0

显然,从'start/wait'文件中“如果它是内部cmd命令或批处理文件,那么命令处理器将通过/ K开关运行到cmd.exe。这意味着窗口将在命令已经运行“。 所以它是默认的/ K开关添加'开始/等待',这是一个问题。如果我将其更改为'开始/等待cmd/c%AZ_BATCH_NODE_SHARED_DIR%\ RunSqlCmd.cmd'它一切正常,但stdout和stderr都丢失 – YuGagarin

回答

0

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

如果它是一个批处理文件,您可以调用该批处理文件。它会自动等待内部完成命令。

%AZ_BATCH_NODE_SHARED_DIR%\RunSqlCmd.cmd 

即使没有再次调用start或cmd,它也能正常工作。

主要的问题是你发送带有引号的参数到外部程序中的命令,所以你再次调用cmd,它将命令发送到这个cmd窗口并在发送到外部时删除引号。只要按照原样调用脚本就行。

+0

感谢您的评论,但我确实尝试运行.cmd文件本身,它确实不行。使它在Azure Batch下工作的唯一方法是使用cmd/c start/wait cmd/c RunSqlCmd.cmd,这在我的观点中是离开的,因此原始问题在这里... – YuGagarin

+0

实际的故障如下当RunSqlCmd。cmd是由Azure Batch预期的自己运行的“警告:任务[topNtask0]返回了非零退出代码 - 这可能表示任务 执行或完成失败。” – YuGagarin