我正在尝试从Powershell中的Invoke-Sqlcmd捕获详细输出。任何人都有任何想法这样做:
即。
Invoke-Sqlcmd -Query "PRINT 'Hello World!';" -ServerInstance $Server -verbose > D:\SqlLog.txt
SqlLog.txt文件应包含文本“Hello World!”
答案 0 :(得分:10)
根据Capture Warning, Verbose, Debug and Host Output via alternate streams:
...如果我想在脚本中捕获详细输出:
stop-process -n vd * -verbose 4>& 1> C:\日志\ StoppedProcesses.log
所以,你会做类似
的事情(Invoke-Sqlcmd -Query "PRINT 'Hello World!';" -ServerInstance $Server -verbose) 4> c:\temp\myoutput.txt
其中4是“详细”流。
答案 1 :(得分:9)
由于捕获详细输出不是人们可以通过PowerShell主机的本机构造轻松完成的,因此您始终可以使用PowerShell object的编程访问。然后,您可以访问五种不同的信息流:
> $ps = [PowerShell]::Create()
> [ref]$e = New-Object System.Management.Automation.Runspaces.PSSnapInException
> $ps.Runspace.RunspaceConfiguration.AddPSSnapIn( "SqlServerCmdletSnapin100", $e ) | Out-Null
> $ps.AddCommand( "Invoke-Sqlcmd" ).AddParameter( "Query", "Print 'hello world'" ).AddParameter( "Verbose" )
> $ps.Invoke()
> $ps.Streams
Error : {}
Progress : {}
Verbose : {hello world}
Debug : {}
Warning : {}
> $ps.Streams.Verbose | % { $_.Message | Out-File -Append D:\SqlLog.txt }
> cat D:\SqlLog.txt
hello world
答案 2 :(得分:4)
请尝试:
Invoke-Sqlcmd -Query "PRINT 'Hello World!';" -ServerInstance $Server -verbose > D:\SqlLog.txt 2>&1
答案 3 :(得分:3)
所以我知道这有点无关,但我需要抓住" RAISERROR"和" PRINT"单个变量中的语句然后是行数据。我是这样做的:
$Messages = %{ $Rows = Invoke-Sqlcmd -Query "PRINT 'Hello World!';" -ServerInstance $Server -verbose} 4>1
来自Invoke-SqlCmd的行数据在STDOUT上,由$ Rows消耗,详细输出在管道上继续并被重定向到STDOUT(由于$ Rows为空)。 STDOUT中唯一可以传递给$ Messages的是Verbose输出。呼!
现在在$ Messages.Message上获取数据还有点复杂。
答案 4 :(得分:2)
如果您只想要打印语句,只需在命令末尾添加-Verbose。
EG。 Invoke-Sqlcmd -Query $ Query -ServerInstance $ Server -Database“master”-Verbose
可以将其与Out-File结合使用: -
Invoke-Sqlcmd -InputFile“C:\ MyFolder \ TestSQLCmd.sql”| Out-File -filePath“C:\ MyFolder \ TestSQLCmd.rpt”
答案 5 :(得分:2)
在Powershell 3中,*>>将所有输出(包括详细)附加到文件
'Running sql query:'
Invoke-Sqlcmd -ServerInstance .\sql -Verbose -Query "Print 'hello world'" *>> c:\temp\sql.log
'Display file content:'
Get-Content c:\temp\sql.log | Out-Host
答案 6 :(得分:2)
对我来说,以下命令有效:
invoke-sqlcmd -inputfile "C:\cfn\scripts\set-tempdb.sql" -Verbose *> "C:\cfn\log\set-tempdb.log"
我在使用SQL Enterprise 2016的Windows 2016上使用Powershell 5.1
答案 7 :(得分:1)
捕获详细输出很棘手。我在这个主题上看到的唯一帖子是: http://www.nivot.org/2009/08/19/PowerShell20AConfigurableAndFlexibleScriptLoggerModule.aspx
更简单的选择是不使用详细信息并转换为写入输出。您可以修改invoke-sqlcmd2函数以使用write-output而不是http://poshcode.org/2279
答案 8 :(得分:1)
我认为有一个更简单的解决方案。我正在努力将详细流实时输出到控制台,并将其另存为变量以在脚本中进一步向下游使用。
Invoke-Sqlcmd -Query $Query `
-Database $Database `
-ServerInstance $ServerInstance `
-Verbose 4>&1 | Tee-Object -Variable output
4>&1
将详细流重定向到主输出流
Tee-Object
允许管道输出到两个不同的位置,在这种情况下,invoke-sqlcmd输出到控制台,但也保存到变量。
答案 9 :(得分:0)
我同时使用-IncludeSqlUserErrors和-ErrorVariable truc的组合
$result = Invoke-Sqlcmd -ServerInstance $instance -Database 'master' -Query "select @@version" -IncludeSqlUserErrors -ErrorVariable truc
Write-Host $truc
答案 10 :(得分:0)
您可以将输出捕获到变量中,而不必将其重定向到文件中。
invoke-sqlcmd "select 13.0/7.0" |out-string -outvariable abc
$abc
产生:
Column1
-------
1.857142