Powershell Invoke-Sqlcmd захватывает подробный вывод

Я пытаюсь захватить подробный вывод из Invoke-Sqlcmd в Powershell. У кого-нибудь есть идеи для этого:

то есть.

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

Файл SqlLog.txt должен содержать текст "Hello World!"

Ответ 1

Так как захват подробного вывода не является чем-то, что можно легко выполнить с помощью собственных конструкторов хоста PowerShell, вы всегда можете использовать программный доступ к объекту PowerShell. Затем вы можете получить доступ к пяти различным потокам информации:

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

Согласно Capture Warning, Verbose, Debug и Host Output через альтернативные потоки:

... если бы я хотел захватить подробный вывод в сценарии:

остановка процесса -n vd * -verbose 4> & 1> C:\Logs\StoppedProcesses.log

Итак, вы бы сделали что-то вроде

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

Где 4 - "многословный" поток.

Ответ 3

Попробуйте:

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

Я нашел его в

Ответ 4

Итак, я знаю, что это немного несвязано, но мне нужно было зафиксировать операторы 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.

Ответ 5

Если вам просто нужны инструкции печати, просто добавьте -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

Ответ 6

В 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

Ответ 7

Для меня работала команда ниже:

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

Я использую Powershell 5.1 в Windows 2016 с SQL Enterprise 2016

Ответ 8

Захват подробного вывода сложный. Единственное сообщение, которое я видел по этой теме, здесь: http://www.nivot.org/2009/08/19/PowerShell20AConfigurableAndFlexibleScriptLoggerModule.aspx

Более простой вариант заключается в том, чтобы не использовать подробный и конвертировать в write-output. Вы можете изменить функцию invoke-sqlcmd2 для использования write-output вместо http://poshcode.org/2279

Ответ 9

Я думаю, что есть более простое решение. Я изо всех сил пытался вывести как подробный поток в консоль в режиме реального времени, а также сохранить его как переменную для дальнейшего использования в моем сценарии.

Invoke-Sqlcmd -Query $Query ' -Database $Database ' -ServerInstance $ServerInstance ' -Verbose 4>&1 | Tee-Object -Variable output

4>&1 перенаправляет подробный поток на основной выходной поток Tee-Object позволяет конвейеру выводить в два разных места, в этом случае invoke-sqlcmd выводит на консоль, но также сохраняет в переменную.

Ответ 10

Я использую обе комбинации -IncludeSqlUserErrors и -ErrorVariable truc

$result = Invoke-Sqlcmd -ServerInstance $instance -Database 'master' -Query "select @@version" -IncludeSqlUserErrors -ErrorVariable truc

Write-Host $truc