Как я могу записать вывод информационной консоли Powershell в переменную? - PullRequest
1 голос
/ 28 января 2020

Я не могу понять, как захватить приведенный ниже текст для разбора. Я попытался установить его в переменную, а также перенаправить все потоки с помощью *> & 1. Как я могу получить выходной текст? *> & 1 работает для ошибок, но не для текста ниже по какой-то причине? Запись в файл невозможна.

Connect-Mailbox -Identity $guidT -user $targetDNT -Alias $aliasT -Database $databaseT -DomainController $domainSpecificDCsSourceAccountT[0]

Я также пытался

$outValue = Connect-Mailbox -Identity $guidT -user $targetDNT -Alias $aliasT -Database $databaseT -DomainController $domainSpecificDCsSourceAccountT[0] *>&1

ПРЕДУПРЕЖДЕНИЕ: операция завершена успешно, но изменение не вступит в силу до тех пор, пока не станет активным Происходит репликация каталогов.

[edit] Для repro эта команда, похоже, попадает в ту же ситуацию, и ее проще настроить / настроить

$var = Set-Mailbox $sourceUserT -LitigationHoldEnabled $false

[edit2]

Некоторые команды, такие как set-mailbox, будут работать, если вы измените тип со строки на массив, например, но connect-mailbox не может использовать это?

Так что это была глупая удача, это работает для команды set-mailbox, но не для команды connect-mailbox?

PS> Set-Mailbox "first.last" -LitigationHoldEnabled $false -WarningVariable wv
    WARNING: The command completed successfully but no settings of 'xxx/last, first' have been modified.

PS> $wv

PS>

Однако, когда это было сделано так

[System.Collections.ArrayList]$wvar = @();
Set-Mailbox "onprem.detailee1" -LitigationHoldEnabled $false -WarningVariable +wvar
WARNING: The command completed successfully but no settings of 'xxxx/last, first' have been modified.

PS> write-host $wvar
The command completed successfully but no settings of 'xxxx/last, first' have been modified.

Поэтому Powershell не может выводить некоторые выходные данные (предупреждение, error, et c) в строку, однако они могут добавить объект в массив. Как ни странно, нетипизирующая часть языка Powershell здесь не применима.

Ответы [ 4 ]

0 голосов
/ 10 апреля 2020

Скорее всего, проблема связана с ошибочным поведением в отношении потоков из неявным удалением команд , например, созданных с помощью Import-PSSession; эта проблема GitHub предположительно связана.

Вы уже нашли один обходной путь, как показано в вашем вопросе: если вы явно создаете целевую переменную для передачи в -WarningVariable как System.Collections.ArrayList экземпляр и передают имя переменной с префиксом + (-WarningVariable +var) - обычно предназначены для добавления к существующему значению переменной - возможно получение предупреждений.

Немного более простой обходной путь заключается в вызове команды через Invoke-Command и применении -WarningVariable к последний :

Invoke-Command -WarningVariable warnings {
  Connect-Mailbox -Identity $guidT -user $targetDNT -Alias $aliasT -Database $databaseT -DomainController $domainSpecificDCsSourceAccountT[0]
}

# $warnings now contains any warnings emitted by the command.
0 голосов
/ 28 января 2020

Вы должны иметь возможность использовать -WarningVariable Общий параметр для захвата сообщений, предназначенных для потока предупреждений.

Connect-Mailbox -Identity $guidT -user $targetDNT -Alias $aliasT -Database $databaseT -DomainController $domainSpecificDCsSourceAccountT[0] -WarningVariable WarningVar

$WarningVar

Общие параметры включают переменные параметры для сообщений, отправляемых на потоки ошибок, информации и предупреждений.

0 голосов
/ 11 февраля 2020

Один из способов, с помощью которого я нашел это, - явно установить ошибку для остановки (-ea stop) для командлета в инструкции try catch, затем я мог бы получить значение исключения с помощью $_.Exception.Message в операторе catch, так как это вызывает Командлет для завершения ошибки.

Это то, что я нашел разочаровывающим из-за c#, где оператор try / catch работает без необходимости явного определения ошибки как завершающей или нет. Если вы не сделаете этого для некоторых командлетов, try / catch не будет работать и никогда не поймает завершающую ошибку.

Надеюсь, это поможет другим, больше информации

https://www.vexasoft.com/blogs/powershell/7255220-powershell-tutorial-try-catch-finally-and-error-handling-in-powershell

0 голосов
/ 28 января 2020

Вы пробовали следующее?

$var = myCommand | out-string
...