Powershell Invoke-Sqlcmd перехватывает подробный вывод - PullRequest
11 голосов
/ 22 декабря 2010

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

т.е.

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

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

Ответы [ 9 ]

11 голосов
/ 28 февраля 2014

Согласно Вывод предупреждений, подробный вывод, отладка и вывод хоста через альтернативные потоки :

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

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

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

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

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

9 голосов
/ 24 декабря 2010

Поскольку захват подробных выводов - это не то, что легко сделать с помощью собственных конструкций хоста 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
4 голосов
/ 22 декабря 2010

Пожалуйста, попробуйте:

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

Я нашел это в

3 голосов
/ 19 декабря 2014

Итак, я знаю, что это немного не связано, но мне нужно было записать операторы "RAISERROR" и "PRINT" в отдельную переменную, а затем в данные строки. Вот как я это сделал: $Messages = %{ $Rows = Invoke-Sqlcmd -Query "PRINT 'Hello World!';" -ServerInstance $Server -verbose} 4>1

Это строка данных из Invoke-SqlCmd находится на STDOUT, который используется $ Rows, подробный вывод продолжается по каналу и перенаправляется в STDOUT (который, благодаря $ Rows, пуст). Единственная вещь в STDOUT, которую можно передать $ Messages, это подробный вывод. Уф!

Немного сложнее получить данные, которые теперь находятся в $ Messages.Message.

2 голосов
/ 16 ноября 2017

Для меня сработала следующая команда:

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

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

2 голосов
/ 04 марта 2016

В 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
2 голосов
/ 19 октября 2012

Если вам нужны операторы печати, просто добавьте -Verbose в конце команды.

Например.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

1 голос
/ 07 марта 2019

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

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

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

1 голос
/ 23 декабря 2010

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...