关于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
分割,它仍然会输出“什么”。
如何?如何复制此行为并制作某种代理Cmdlet以允许此行为?
如果某些全局条件是正确的且颜色不同,我需要将信息输出到控制台。我是二手的,收到的脚本是
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'.
答案 0 :(得分:2)
您想要的是ValueFromRemainingArguments
参数属性。它将所有非绑定参数填充到指定参数中。它与$PSBoundParameters
相反。 [咧嘴]
有关该主题的MSDocs网站...
获取并设置一个标志,该标志指定其余的命令行参数应以数组形式与此参数关联。如果未指定,则假定为false。