2015-05-24 74 views
1

我想我只是缺少的东西,但这里是我的设置,我有一个测试模块与三个测试功能,我想设置$ 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) 
} 

写测试值。 ps1:

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

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

    Write-Output -InputObject $OutputValue 
} 

so,is应该可以这样做:

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

但它什么也没有返回,$ OutputValue仍然是$ null。我得到它的唯一方法是使用$ Global:范围,我不想这么做。我觉得像在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 
所以从侧面中的函数

,在$脚本范围存在,只是没有在参数。也许我只是不明白示波器如何完全工作,谢谢任何帮助和/或澄清。

回答

3

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

New-Module { 
    [email protected]{'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 
[email protected]{'G:Value'=20} 
F 
G 
Invoke-F 
Invoke-G 

结果:

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

所以,当从功能全局范围内执行,那么全球$PSDefaultParameterValues得到读。当从其他模块功能执行功能时,则读取模块$PSDefaultParameterValues

+0

谢谢你的伟大的探索,现在让我问你这个,如果我使用$ Global:Scope会不会那么糟糕? 99%的时间,我永远不会这样做,但是,这可以追溯到我在https://github.com/dotps1/WinSCP上工作的模块,基本上,首先必须完成的工作是创建一个Session对象,然后每个其他cmdlet都使用它,因此,我的代码如下所示:'$ Global:PSDefaultParameterValues [“* - WinSCP *:WinSCPSession”] = $ session'。我认为这不会影响任何其他cmdlet。再次感谢。 – dotps1

+2

@ dotps1恕我直言,最好允许用户通过h(im | er)self设置'$ PSDefaultParameterValues',如果(s)他想这样做。主要问题,正如我所看到的,你的代码是,有人可以用自定义前缀'Import-Module -Prefix custom'导入你的模块。而你的默认参数不起作用。 – PetSerAl

+0

我倾向于使用的一种解决方法:编写存储脚本范围变量的Get-WinSCPConfig和Set-WinSCPConfig函数,并且可选地序列化磁盘以实现持久“默认”。将这些用作适当功能参数的默认值。执行不力的例子[这里](https://github.com/RamblingCookieMonster/Infoblox)。干杯! –