设置$ PSDefaultParametersValues以在模块范围

时间:2015-05-24 18:51:12

标签: powershell module scope default-value

我想我只是遗漏了一些东西,但这里是我的设置,我有一个带有三个测试函数的测试模块,我想设置$ PSDefaultParameterValues来创建一个只存在于其他cmdlet中的公共参数值说模块。这是我的代码:

test.psm1:

$PSDefaultParameterValues.Clear()

"$(Split-Path -Path $MyInvocation.MyCommand.Path)\*.ps1" | Resolve-Path | % { . $_.ProviderPath }

在同一个目录中我有我的功能:

新-TestFunction.ps1:

Function New-TestFunction
{
     [CmdletBinding()]
     [OutputType([String])]

     Param
     (
         [String]
         $InputString
     )

     $Script:PSDefaultParameterValues.Add("Write-TestValue:OutputValue", $InputString)
}

写TestValue.ps1:

Function Write-TestValue
{
     [CmdletBinding()]
     [OutputType()]

     Param
     (
          [Parameter()]
          [String]
          $OutputValue
     )

     Write-Output -InputObject $OutputValue
}

所以,我应该能够做到这一点:

PS C:\> New-TestFunction -InputString 'Test String'; Write-TestValue
PS C:\> 'Test String'

但它没有返回任何内容,$ OutputValue仍为$ null。我使用它的唯一方法是使用$ Global:scope,我宁愿不做。我觉得在Module范围下导入的函数应该看到$ Script:变量范围。我写了一个小测试函数:

写ScriptPSDefaultParameterValues.ps1

Function Write-ScriptPSDefaultParameterValues
{
    [CmdletBinding()]
    [OutputType()]

    Param
    (
    )

    Write-Output -InputObject $Script:PSDefaultParameterValues
}

这有效:

PS C:\>  New-TestFunction -InputString 'Test String'; Write-ScriptPSDefaultParameterValues
Name                         Value
----                         -----
Write-TestValue:OutputValue  Test String

因此,从函数内部来看,$ Script作用域存在,而不是参数。也许我只是不明白范围是如何完全运作的,感谢任何帮助和/或澄清。

1 个答案:

答案 0 :(得分:3)

$PSDefaultParameterValues从调用发生的范围读取,而不是从定义函数的范围读取。

New-Module {
    $PSDefaultParameterValues=@{'F:Value'=10}
    function F{
        [CmdletBinding()]
        param(
            $Value
        )
        "F:`$Value:$Value"
    }
    function G{
        [CmdletBinding()]
        param(
            $Value
        )
        "G:`$Value:$Value"
    }
    function Invoke-F{
        F
    }
    function Invoke-G{
        G
    }
}|Out-Null
$PSDefaultParameterValues=@{'G:Value'=20}
F
G
Invoke-F
Invoke-G

结果:

F:$Value:
G:$Value:20
F:$Value:10
G:$Value:

因此,当函数从全局范围执行时,全局$PSDefaultParameterValues将被读取。当从其他模块函数执行函数时,模块$PSDefaultParameterValues将被读取。