我为政府客户工作,我们的部署由另一个承包商控制,该承包商要求我们提供Powershell脚本来运行数据库脚本。不幸的是,安全性很严格,而且我没有添加Powershell管理单元的权限,因此我必须使用良好的旧sqlcmd而不是Invoke-Sqlcmd。我遇到了因运行脚本而产生的错误要传递回Powershell的麻烦。
例如,在下面的场景中,假设“ 02 test2.sql”有一个错误导致其无法运行。我想要终止脚本,将消息记录到控制台,并将sqlcmd的输出记录到文件中。无论我如何尝试,PowerShell都无法识别sqlcmd故障。
singleton
答案 0 :(得分:1)
如果您仅将适当的输出流重定向到文件,则您的方法应该起作用。默认情况下,>>
仅重定向成功流。错误流为2
(2>>
)。所有流都是*
(*>>
)。如果只想重定向错误和成功流,则可以将错误流发送到成功流,然后通过2>&1 >> Production.log.txt
将成功流发送到文件。如果查询产生错误,$LastExitCode
仍会提供1
。
示例:重定向所有流
ECHO "Running `"02 test2.sql`"" | tee -a Production.log.txt
sqlcmd -r -b /S serverName /d dbName -i "02 test2.sql" *>> Production.log.txt
if ($LASTEXITCODE -ne 0) {
Write-Error "Error occured while running `"02 test2.sql`". Terminating script."
TerminateScript
}
示例:重定向错误和成功流
sqlcmd -r -b /S serverName /d dbName -i "02 test2.sql" 2>&1 >> Production.log.txt
我知道这并不是您想要的,但这是另一种选择。您可以使用Start-Process
来调用sqlcmd
并重定向错误和成功流。请记住,每次运行时输出文件都会被覆盖。如果没有错误,error.txt
文件将为空。
Start-Process sqlcmd -ArgumentList "-r -b /S poc-vtxrtndb2 /d test -i `"02 test2.sql`"" -NoNewWindow -RedirectStandardError error.txt -RedirectStandardoutput log.txt
if (Get-Content error.txt) {
"There was an error in the script"
}
有关PowerShell输出重定向的更多信息,请参见About_Redirection。
答案 1 :(得分:0)