我怎样才能有一个powershell模块为函数调用设置默认参数值

时间:2014-05-21 15:41:40

标签: powershell

在我的powershell模块中,我有一个函数DoStuff,它带有参数foo。当您调用Initialize函数时,如果未指定,我希望它使DoStuff的所有调用都传递foo的默认值。

通常,这是通过$PSDefaultParameterValues完成的,但是我注意到在模块内部运行的函数和在模块外部运行的函数(即从shell运行)不使用相同的默认参数字典。

以下是一个例子:

function Test1 ([Parameter(Mandatory=$true)][String]$testParam)
{
   $global:PSDefaultParameterValues["Print:output"] = $testParam
}

function Test2 ([Parameter(Mandatory=$true)][String]$testParam)
{
   $PSDefaultParameterValues["Print:output"] = $testParam
}

function CallPrint
{
   Print
}

function Print([Parameter(Mandatory=$true)][String]$output)
{
    Write-Host $output
}

为了说明我的问题,我运行了以下命令:

  

PS C:\ Users \ ms> Import-Module'。\ Documents \ Test Powershell Scripts \ ModuleTest.psm1'

     

PS C:\ Users \ ms> Test1 abc

     

PS C:\ Users \ ms> Test2 def

     

PS C:\ Users \ ms> CallPrint

     

DEF

     

PS C:\ Users \ ms>打印

     

ABC

这表明在从模块内部调用函数时使用$PSDefaultParameterValues,但在从模块外部调用函数时使用$global:PSDefaultParameterValues

如果不同时设置这两种方法,有没有办法获得一致的行为?

1 个答案:

答案 0 :(得分:1)

由于全局范围和模块范围显然都有$ PSDefaultParameterValues,因此您必须同时设置它们。您可以先通过设置全局范围来简化它,然后再

$PSDefaultParameterValues = $Global:PSDefaultParameters.clone()

在模块中同步值。

话虽如此,在全球范围内设置这些值听起来像是个坏主意,可能会产生意想不到的后果。