有没有办法在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中是否存在类似的内容?
答案 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和 函数使用自定义默认值,除非您指定另一个 命令中的值。
由于Hashtable $PSDefaultParameterValues
默认存在,因此您无需将其设置为明确。也就是说,可以只添加一个新的键值对,因此以下工作:
$PSDefaultParameterValues = @{"*:ComputerName" = $ComputerName}
$PSDefaultParameterValues['*:ComputerName'] = $ComputerName
对于那些不想阅读文档的人,此哈希表中的键的语法是:<cmdlet>:<parameter>
。
在此示例中,cmdlet设置为“*”以设置所有cmdlet的默认值。