复制PowerShell的Write-Host行为

时间:2019-11-01 01:00:50

标签: powershell

关于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'.

1 个答案:

答案 0 :(得分:2)

您想要的是ValueFromRemainingArguments参数属性。它将所有非绑定参数填充到指定参数中。它与$PSBoundParameters相反。 [咧嘴]

有关该主题的MSDocs网站...

  

获取并设置一个标志,该标志指定其余的命令行参数应以数组形式与此参数关联。如果未指定,则假定为false。