Powershell Invoke-Sqlcmd cattura l’output dettagliato

Sto cercando di catturare l’output dettagliato di Invoke-Sqlcmd in Powershell. Qualcuno ha qualche idea per fare questo:

vale a dire

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

Il file SqlLog.txt deve contenere il testo “Hello World!”

Poiché l’acquisizione di output dettagliato non è qualcosa che si può fare facilmente attraverso i costrutti nativi dell’host PowerShell, è sempre ansible utilizzare l’accesso programmatico all’object PowerShell . È quindi ansible accedere ai cinque diversi flussi di informazioni:

 > $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 

In base a Capture Warning, Verbose, Debug e Host Output tramite flussi alternativi :

… se volessi catturare un output dettagliato in uno script:

stop-process -n vd * -verbose 4> & 1> C: \ Logs \ StoppedProcesses.log

Quindi, faresti qualcosa di simile

 (Invoke-Sqlcmd -Query "PRINT 'Hello World!';" -ServerInstance $Server -verbose) 4> c:\temp\myoutput.txt 

Dove 4 è il stream “verboso”.

Per favore prova:

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

L’ho trovato a

Quindi so che questo è un po ‘non correlato, ma avevo bisogno di catturare le affermazioni “RAISERROR” e “PRINT” in una variabile separata, quindi i dati della riga. Ecco come l’ho fatto: $Messages = %{ $Rows = Invoke-Sqlcmd -Query "PRINT 'Hello World!';" -ServerInstance $Server -verbose} 4>1 $Messages = %{ $Rows = Invoke-Sqlcmd -Query "PRINT 'Hello World!';" -ServerInstance $Server -verbose} 4>1

Fila i dati da Invoke-SqlCmd è su STDOUT che viene consumato da $ Rows l’output dettagliato continua sulla pipe e viene reindirizzato in STDOUT (che, grazie a $ Rows è vuoto). L’unica cosa in STDOUT da consegnare a $ Messages è l’output Verbose. Meno male!

È un po ‘più complicato in quanto per ottenere i dati è ora su $ Messages.Message.

Catturare un output dettagliato è complicato. L’unico post che ho visto su questo argomento è qui: http://www.nivot.org/2009/08/19/PowerShell20AConfigurableAndFlexibleScriptLoggerModule.aspx

Un’opzione più semplice sarebbe non usare verbose e convertire in output in scrittura. È ansible modificare la funzione invoke-sqlcmd2 per utilizzare invece l’output di scrittura http://poshcode.org/2279

Se vuoi semplicemente stampare le istruzioni, aggiungi -Verbose alla fine del comando.

Per esempio. Invoke-Sqlcmd -Query $ Query -ServerInstance $ Server -Database “master” -Verbose

Potrebbe essere in grado di usarlo in combinazione con 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

In Powershell 3, * >> aggiunge tutti gli output (incluso verbose) a un file

 '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 

Per me il seguente comando ha funzionato:

 invoke-sqlcmd -inputfile "C:\cfn\scripts\set-tempdb.sql" -Verbose *> "C:\cfn\log\set-tempdb.log" 

Sto usando Powershell 5.1 su Windows 2016 con SQL Enterprise 2016