Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Powershell 设置$PSDefaultParametersValue以在模块范围内使用_Powershell_Module_Scope_Default Value - Fatal编程技术网

Powershell 设置$PSDefaultParametersValue以在模块范围内使用

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以生成一个公共参数值,该值只存在于所述模块中的其他cmdlet。这是我的密码:

test.psm1:

$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函数来存储脚本作用域变量,并可选地序列化到磁盘以获得持久的“默认值”。使用这些作为相应函数参数的默认值。实施不佳的示例。干杯