如何将参数从我的脚本传播到内部函数调用?

时间:2014-10-24 15:33:51

标签: powershell

我在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,则会抱怨它无法找到计算机""。

3 个答案:

答案 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

参考

about_Parameter_Default_Values

答案 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
}