有没有办法在PowerShell中为多个函数调用设置命名参数的默认值?

时间:2016-10-20 16:37:23

标签: powershell

有没有办法在PowerShell中为多个函数调用设置命名参数的默认值?

例如,如果我有以下代码:

$ComputerName = "ComputerName"
Invoke-Command -ComputerName $ComputerName -ScriptBlock {hostname}
Get-WmiObject -ComputerName $ComputerName -Class Win32_OperatingSystem
Get-Process -ComputerName $ComputerName
Get-Service -ComputerName $ComputerName

我没有为每个命令指定-ComputerName,而是让它设置一次并让每个命令使用我指定的值。

执行此操作的一种方法是splatting:

$ComputerNameParameter = @{ComputerName = $ComputerName }
Invoke-Command @ComputerNameParameter -ScriptBlock {hostname}
Get-WmiObject @ComputerNameParameter -Class Win32_OperatingSystem
Get-Process @ComputerNameParameter
Get-Service @ComputerNameParameter

这并不比原版好得多。

我真的希望能够设置默认值,以便在设置我的默认值时,我调用的所有具有-ComputerName参数的函数都将使用我的默认值,除非我另有说明。

最终结果如下所示:

Set-DefaultValueForFunctionNamedParameter -Name ComputerName -Value $ComputerName
Invoke-Command -ScriptBlock {hostname}
Get-WmiObject -Class Win32_OperatingSystem
Get-Process
Get-Service

PowerShell中是否存在类似的内容?

2 个答案:

答案 0 :(得分:2)

从类似问题列表中,我看到有人在讨论使用$ about_Parameters_Default_Values中解释的$ PSDefaultParameterValues。

以下是如何用它来解决我的例子:

$PSDefaultParameterValues = @{"*:ComputerName" = $ComputerName}
Invoke-Command -ScriptBlock {hostname}
Get-WmiObject -Class Win32_OperatingSystem
Get-Process
Get-Service

答案 1 :(得分:2)

使用$PSDefaultParameterValues(PowerShell 3.0及更高版本):

  

$ PSDefaultParameterValues首选项变量允许您指定   任何cmdlet或高级功能的自定义默认值。 Cmdlet和   函数使用自定义默认值,除非您指定另一个   命令中的值。

     

about_Parameters_Default_Values

由于Hashtable $PSDefaultParameterValues默认存在,因此您无需将其设置为明确。也就是说,可以只添加一个新的键值对,因此以下工作:

$PSDefaultParameterValues = @{"*:ComputerName" = $ComputerName}

$PSDefaultParameterValues['*:ComputerName'] = $ComputerName

对于那些不想阅读文档的人,此哈希表中的键的语法是:<cmdlet>:<parameter>

在此示例中,cmdlet设置为“*”以设置所有cmdlet的默认值。