在我的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
。
如果不同时设置这两种方法,有没有办法获得一致的行为?
答案 0 :(得分:1)
由于全局范围和模块范围显然都有$ PSDefaultParameterValues,因此您必须同时设置它们。您可以先通过设置全局范围来简化它,然后再
$PSDefaultParameterValues = $Global:PSDefaultParameters.clone()
在模块中同步值。
话虽如此,在全球范围内设置这些值听起来像是个坏主意,可能会产生意想不到的后果。