Powershell 设置$PSDefaultParametersValue以在模块范围内使用
我想我只是缺少了一些东西,但这是我的设置,我有一个带有三个测试函数的测试模块,我想设置$PSDefaultParameterValues以生成一个公共参数值,该值只存在于所述模块中的其他cmdlet。这是我的密码: test.psm1:Powershell 设置$PSDefaultParametersValue以在模块范围内使用,powershell,module,scope,default-value,Powershell,Module,Scope,Default Value,我想我只是缺少了一些东西,但这是我的设置,我有一个带有三个测试函数的测试模块,我想设置$PSDefaultParameterValues以生成一个公共参数值,该值只存在于所述模块中的其他cmdlet。这是我的密码: test.psm1: $PSDefaultParameterValues.Clear() "$(Split-Path -Path $MyInvocation.MyCommand.Path)\*.ps1" | Resolve-Path | % { . $_.ProviderPath
$PSDefaultParameterValues.Clear()
"$(Split-Path -Path $MyInvocation.MyCommand.Path)\*.ps1" | Resolve-Path | % { . $_.ProviderPath }
在同一目录中,我有我的功能:
New-TestFunction.ps1:
Function New-TestFunction
{
[CmdletBinding()]
[OutputType([String])]
Param
(
[String]
$InputString
)
$Script:PSDefaultParameterValues.Add("Write-TestValue:OutputValue", $InputString)
}
Write-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,我不希望这样做。我觉得在模块作用域下导入的函数应该看到$Script:scope of variables。我写了一个小测试函数:
Write-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作用域是存在的,只是不在参数中。也许我只是不完全理解作用域是如何工作的,谢谢您的帮助和/或澄清。
$PSDefaultParameterValues
从调用发生的作用域读取,而不是从定义函数的作用域读取
新模块{
$PSDefaultParameterValues=@{'F:Value'=10}
函数F{
[CmdletBinding()]
param(
美元价值
)
“F:`$Value:$Value”
}
函数G{
[CmdletBinding()]
param(
美元价值
)
“G:`$Value:$Value”
}
函数调用-F{
F
}
函数调用-G{
G
}
}|出空
$PSDefaultParameterValues=@{'G:Value'=20}
F
G
调用-F
调用-G
结果:
F:$Value:
G:$Value:20
F:$Value:10
G:$Value:
所以,当从全局范围执行函数时,全局
$PSDefaultParameterValues
被读取。当从其他模块函数执行函数时,然后读取模块$PSDefaultParameterValues
。感谢您的精彩解释,现在让我问您,如果我使用$Global:Scope会有那么糟糕吗?99%的时候,我永远不会这样做,但是,这可以追溯到我正在处理的模块,基本上,必须做的第一件事是创建一个会话对象,然后每个其他cmdlet都会使用它,因此,我的代码看起来是这样的:$Global:PSDefaultParameterValues[“*-WinSCP*:winscpsSession”]=$Session
。我认为这不会影响任何其他cmdlet。再次感谢。@dotps1 IMHO,如果用户愿意,最好允许他自己设置$psdefaultparametervalue
。正如我所看到的,代码的主要问题是,有人可以使用自定义前缀导入您的模块import module-prefix custom
。我倾向于使用一种解决方法:编写Get WinSCPConfig和Set WinSCPConfig函数来存储脚本作用域变量,并可选地序列化到磁盘以获得持久的“默认值”。使用这些作为相应函数参数的默认值。实施不佳的示例。干杯