我在PowerShell中编写脚本,我需要将我声明为脚本参数的可选参数传递给函数。
例如,这可能是Example.ps1
文件:
[CmdletBinding()]
Param(
[string] $Param1,
[string] $Param2,
[string] $Param3,
[string] $ComputerName
)
#... code that uses the first 3 parameters ...
# Here, I need to pass the 'ComputerName' parameter along:
Start-DscConfiguration -Path 'somePath -ComputerName $ComputerName -Wait
我尝试了两种使用splatting的方法,但我对它们中的任何一种都不太满意。第一个是使用PSBoundParameters
hashset,如下所示:
PSBoundParameters.Remove('Param1');
PSBoundParameters.Remove('Param2');
PSBoundParameters.Remove('Param3');
Start-DscConfiguration -Path 'somePath @PSBoundParameters -Wait
第二种方法是使用一个新的哈希表,并带有所需的参数:
$dscParameters = @{
Path = 'somePath'
};
if (-Not [string]::IsNullOrEmpty($ComputerName))
{
$dscParameters.Add('ComputerName', $ComputerName);
}
Start-DscConfiguration @dscParameters -Wait
是否有更优雅的方式将我的参数传播到我在脚本中调用的函数?也许如果有一个更简洁的方法来构造hashset而不包括ComputerName
密钥,如果它没有提供或者什么的话。
更新:
请注意,我无法始终重定向它,因为它是可选的,因此可以为空。如果我在这种情况下将空ComputerName
传递给Start-DscConfiguration
,则会抱怨它无法找到计算机""。
答案 0 :(得分:3)
我通常会构建一个splat哈希表:
[CmdletBinding()]
Param(
[string] $Param1,
[string] $Param2,
[string] $Param3,
[string] $ComputerName
)
$DscParamHash = @{}
if($ComputerName){
$DscParamHash.Add("-ComputerName","$ComputerName")
}
#Insert other params that you want, for example:
$DscParamHash.Add("-Wait",$true)
#Then call the cmdlet
Start-DscConfiguration @DscParamHash
答案 1 :(得分:1)
这个怎么样:
[CmdletBinding()]
Param(
[string] $Param1,
[string] $Param2,
[string] $Param3,
[string] $ComputerName
)
$PSDefaultParameterValues = @{
'Start-DscConfiguration:ComputerName' = $ComputerName
}
#... code that uses the first 3 parameters ...
# Here, I need to pass the 'ComputerName' parameter along:
Start-DscConfiguration -Path 'somePath' -Wait
答案 2 :(得分:0)
[CmdletBinding()]
Param(
[string] $Param1,
[string] $Param2,
[string] $Param3,
[string] $ComputerName
)
#... code that uses the first 3 parameters ...
if (-not($PSBoundParameters['ComputerName'])){
Start-DscConfiguration -Path 'somePath -Wait
}
else{
Start-DscConfiguration -Path 'somePath -ComputerName $ComputerName -Wait
}