【问题标题】:Recommended Formatting For PowerShell Arguments & PipingPowerShell 参数和管道的推荐格式
【发布时间】:2018-04-06 21:33:36
【问题描述】:

以这样的命令为例:

Get-AdUser -Filter {Enabled -eq $true} -Credential (Get-Credentials) -Server some.server.domain.com | Where-Object {DisplayName -like '*Reemer, Bob*'}

当然,它很粗,很长,而且从屏幕上消失了……把它分成多行(以提高可读性)的首选方法是什么?

请给出适用于 ISE、普通 powershell 解释器和脚本的示例。

【问题讨论】:

    标签: powershell parameters formatting arguments structure


    【解决方案1】:

    您可以使用反引号将单行命令拆分为多行。您的命令最终可能如下所示:

    Get-ADUser -Filter {Enabled -eq $true} `
        -Credential (Get-Credential) `
        -Server some.server.domain.com | 
        Where-Object {DisplayName -like '*Reemer, Bob'}
    

    从技术上讲,反引号是一个转义字符,在这种情况下,我们正在转义回车。反引号也可以在其他情况下使用。

    【讨论】:

    • 管道后面不需要反引号 (|)。
    【解决方案2】:

    当然又粗又长……

    对我来说它看起来非常好,但如果你想要更短的线条,我建议splatting

    $ADUserParams = @{
      Filter = {Enabled -eq $true}
      Credential = (Get-Credential) 
      Server = 'some.server.domain.com'
    }
    Get-ADUser @ADUserParams | Where-Object {DisplayName -like '*Reemer, Bob*'}
    

    您还可以将Where-Object 过滤器脚本块拆分为多行:

    Get-ADUser -Filter {Enabled -eq $true} -Credential (Get-Credentials) -Server some.server.domain.com | Where-Object {
      DisplayName -like '*Reemer, Bob*'
    }
    

    如果你总是经常重复使用相同的参数值,你也可以使用$PSDefaultParameterValues

    $PSDefaultParameterValues['*-AD*:Server'] = 'some.server.domain.com'
    Get-ADUser -Filter {Enabled -eq $true} -Credential (Get-Credentials) | Where-Object {DisplayName -like '*Reemer, Bob*'}
    

    当然你也可以把它们全部组合起来:

    $PSDefaultParameterValues['*-AD*:Server'] = 'some.server.domain.com'
    $ADUserParams = @{
      Filter = {Enabled -eq $true}
      Credential = (Get-Credential) 
    }
    Get-ADUser @ADUserParams | Where-Object {
      DisplayName -like '*Reemer, Bob*'
    }
    

    【讨论】:

    • 哈希表,而不是数组
    • 哈希表,不是数组。
    • 我也认为你想要$AdUserParams而不是@ADUserParams
    • @ 用于“喷溅”确保哈希表的正确部分进入正确的参数。
    • @KolobCanyon 不,变量名前面的@ 是PowerShell 知道您正在尝试使用splatting 并且哈希表不仅仅是一个参数的方式。我已经用文档链接更新了答案
    【解决方案3】:

    您可以使用续行符,即反引号`,如Bryce's answer

    但我一点也不喜欢。它很难看,让编辑很痛苦,而且总体上很难看。

    相反,我推荐splatting

    这使您可以动态定义参数,并为哈希表提供更好的格式,使您的函数/cmdlet 调用美观整洁:

    $myParams = @{
        Filter = { Enabled -eq $true }
        Credential = (Get-Credential)
        Server = 'some.server.domain.com'
    }
    
    Get-ADUser @myParams
    

    请注意,您可以在调用之前多次修改哈希表,并且可以将 splatting 与单个参数结合起来。

    $myParams = @{
        Filter = { Enabled -eq $true }
        Credential = (Get-Credential)
    }
    
    $myParams.Server = Get-MyCustomServer
    
    Get-ADUser @myParams -Verbose
    

    对于管道,只需在 | 字符后直接使用换行符。那部分我非常喜欢,而且我一直都在使用它。

    您还可以在脚本块中使用换行符,因此您也可以在其中使用很好的分隔选项。

    Get-ADUser @myParams -Verbose |
        Where-Object -FilterScript {
            $_.SomeProperty -eq $SomeValue
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-10-05
      • 2021-08-01
      • 2014-08-30
      • 2011-01-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多