Что-то интересное, что я заметил в поведении PowerShell Write-Host
, это то, что он, по-видимому, выводит почти все, если он не привязан к другому встроенному параметру.
Например:
PS> Write-Host "hello" "everyone is cool" "awesome sauce" -ForegroundColor Green "what what"
hello everyone is cool awesome sauce what what (pretend this is green)
Таким образом, даже если объекты для вывода делятся на ForegroundColor
, они все равно выводят «что что».
Как? Как я могу повторить это поведение и создать своего рода прокси-командлет, чтобы учесть это поведение?
У меня есть требование для вывода информации на консоль, если какое-то глобальное условие верно с разными цветами. Я получил этот скрипт из вторых рук, и он был описан в
If ($Global:SomeCondition -eq $True) {
Write-Host "stuff" "more stuff" -ForegroundColor $VaryingColor
}
Я хотел бы сделать его немного более кратким, поэтому я написал следующее:
Function Write-IfSomeCondition {
Param(
[Parameter(
Mandatory = $True,
ValueFromPipeline = $True)
][Object[]]$Object,
[System.ConsoleColor]$ForegroundColor = (. {If ((Get-Host).UI.RawUI.ForegroundColor -ne -1) {(Get-Host).UI.RawUI.ForegroundColor} Else {[System.ConsoleColor]::White}})
)
If ($Condition) {
$Object | Write-Host -ForegroundColor $ForegroundColor
}
}
Но вызов его даетошибка:
PS> Write-IfSomeCondition "hello" "hello" "hello" -ForegroundColor Gray
Write-IfSomeCondition : A positional parameter cannot be found that accepts argument 'hello'.