Powershell Invoke-Sqlcmd捕获详细输出

时间:2010-12-22 16:50:05

标签: powershell

我正在尝试从Powershell中的Invoke-Sqlcmd捕获详细输出。任何人都有任何想法这样做:

即。

Invoke-Sqlcmd  -Query "PRINT 'Hello World!';" -ServerInstance $Server -verbose  > D:\SqlLog.txt

SqlLog.txt文件应包含文本“Hello World!”

11 个答案:

答案 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

I found it at

答案 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”

http://technet.microsoft.com/en-us/library/cc281720.aspx

答案 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