Можно ли проверить, был ли указан аргумент -Verbose в Powershell?

#powershell

#powershell

Вопрос:

Я написал свою собственную функцию ведения журнала Powershell Log с параметрами stream (в каком потоке записывать сообщение) и message (сообщение для записи).

Идея в том, что я могу записывать выходные данные как на консоль, так и в лог-файл. Что я делаю в функции, так это в основном определяю, в каком потоке публиковать сообщение (с помощью оператора switch), а затем записываю сообщение в поток и лог-файл:

 switch ($stream) {
    Verbose {
        Write-Output "$logDate [VERBOSE] $message" | Out-File -FilePath $sgLogFileName -Append
        Write-Verbose $message
        break
    }
}
  

Теперь вопрос в том, можно ли проверить, был ли задан аргумент -Verbose?

Цель состоит в том, чтобы записать сообщение в файл журнала только в том случае, если был задан параметр -Verbose .

Я уже просматривал следующие справочные документы, но не нашел ничего полезного:
— справка о_параметрах
— справка о_коммонпараметрах

Кроме того, параметр -WhatIf не работает с Write-Verbose .

Большое спасибо за ваши ответы!

Ответ №1:

Внутри вашего скрипта проверьте это:

 $PSCmdlet.MyInvocation.BoundParameters["Verbose"].IsPresent
  

Комментарии:

1. Отлично, это именно то, что я искал! Спасибо!

2. @dwettstein Рад помочь!

3. Это выдает ошибку «Невозможно индексировать в нулевой массив».

4. Это правильно учитывает случай, когда -Verbose:$false используется. Тестирование с помощью простой функции показывает, что IsPresent False в этом случае будет установлено значение.

5. Я получаю сообщение «Свойство ‘isPresent» не может быть найдено для этого объекта. Убедитесь, что свойство существует «.

Ответ №2:

Также доступно: проверьте параметр ‘$VerbosePreference’. Если для него установлено значение ‘SilentlyContinue’, то $Verbose не был задан в командной строке. Если для него установлено значение ‘$Continue’, то вы можете предположить, что он был установлен.

Также применяется к следующим другим общим параметрам:

 Name                           Value
----                           -----
DebugPreference                SilentlyContinue
VerbosePreference              SilentlyContinue
ProgressPreference             Continue
ErrorActionPreference          Continue
WhatIfPreference               0
WarningPreference              Continue
ConfirmPreference              High
  

Взято со страницы блога MSDN с давних времен … так что это должно быть актуально для относительно старых версий Powershell. Также смотрите «Get-Help about_CommonParameters» в Powershell v4.

Комментарии:

1. Именно так я и поступил: $verbose = $VerbosePreference -ne 'SilentlyContinue'

Ответ №3:

В более общем плане: поскольку в командной строке можно указать -Verbose:$false , следующий код обрабатывает этот случай. Это также работает для любого другого параметра switch:

 $Verbose = $false
if ($PSBoundParameters.ContainsKey('Verbose')) { # Command line specifies -Verbose[:$false]
    $Verbose = $PsBoundParameters.Get_Item('Verbose')
}
  

Комментарии:

1. Возможно } , здесь отсутствует завершение?

Ответ №4:

Наткнулся на это в поисках того же ответа и нашел хорошую информацию, а также некоторые не очень хорошие. Отмеченный ответ кажется устаревшим и неправильным, как указано в комментариях. Объект свойства PSBoundParameter из объекта MyInvocation представляет собой словарь (возможно, версия 5.1 выше ранее не проверялась), который не содержит свойства isPresent. Запрашивающий также забыл учесть $VerbosePreference, где в других ответах была представлена эта опция.

Вот решение, которое делает его простым и легким:

 if ( $PSBoundParameters['Verbose'] -or $VerbosePreference -eq 'Continue' ) {
   # do something
}
  

$PSBoundParameters — это объект хеш-таблицы, если значение присутствует и true, оно будет равно true, если оно отсутствует или присутствует, а не true, оно будет равно false . VerbosePreference, который устанавливается на уровне сеанса, будет отображать подробные инструкции, когда значение равно Continue . Соедините это в условии, используя логическое или, и вы получите точное представление, если требуется подробный вывод.

Ответ №5:

Если вы определяете, печатать или нет в зависимости от значения -Verbose параметра, рассмотрите возможность использования Write-Verbose вместо Write-Host : https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.utility/write-verbose?view=powershell-7.1