PowerShell 参数和管道的推荐格式
Recommended Formatting For PowerShell Arguments & Piping
以这样的命令为例:
Get-AdUser -Filter {Enabled -eq $true} -Credential (Get-Credentials) -Server some.server.domain.com | Where-Object {DisplayName -like '*Reemer, Bob*'}
当然,它很恶心、很长而且超出了屏幕...将其分成多行(以提高可读性)的首选方法是什么?
请给出在 ISE、普通 powershell 解释器和脚本中工作的示例。
您可以使用反引号将单行命令拆分为多行。您的命令最终可能如下所示:
Get-ADUser -Filter {Enabled -eq $true} `
-Credential (Get-Credential) `
-Server some.server.domain.com |
Where-Object {DisplayName -like '*Reemer, Bob'}
从技术上讲,反引号是一个转义字符,在本例中我们转义回车 return。反引号也可以在其他情况下使用。
Of course it is gross and long...
我觉得非常好,但如果你想要更短的行,我建议 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*'
}
您可以使用换行符,这是一个反引号 `
,如 .
但我一点也不喜欢那样。很难看,编辑起来很痛苦,而且整体很难看。
相反,我推荐 splatting。
这让您既可以动态定义参数,又可以为哈希表设置更好的格式,从而使您的 function/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
}
以这样的命令为例:
Get-AdUser -Filter {Enabled -eq $true} -Credential (Get-Credentials) -Server some.server.domain.com | Where-Object {DisplayName -like '*Reemer, Bob*'}
当然,它很恶心、很长而且超出了屏幕...将其分成多行(以提高可读性)的首选方法是什么?
请给出在 ISE、普通 powershell 解释器和脚本中工作的示例。
您可以使用反引号将单行命令拆分为多行。您的命令最终可能如下所示:
Get-ADUser -Filter {Enabled -eq $true} `
-Credential (Get-Credential) `
-Server some.server.domain.com |
Where-Object {DisplayName -like '*Reemer, Bob'}
从技术上讲,反引号是一个转义字符,在本例中我们转义回车 return。反引号也可以在其他情况下使用。
Of course it is gross and long...
我觉得非常好,但如果你想要更短的行,我建议 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*'
}
您可以使用换行符,这是一个反引号 `
,如
但我一点也不喜欢那样。很难看,编辑起来很痛苦,而且整体很难看。
相反,我推荐 splatting。
这让您既可以动态定义参数,又可以为哈希表设置更好的格式,从而使您的 function/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
}