#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