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