我想我只是遗漏了一些东西,但这里是我的设置,我有一个带有三个测试函数的测试模块,我想设置$ 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作用域存在,而不是参数。也许我只是不明白范围是如何完全运作的,感谢任何帮助和/或澄清。
答案 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
将被读取。