我想我只是缺少的东西,但这里是我的设置,我有一个测试模块与三个测试功能,我想设置$ 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
所以从侧面中的函数
,在$脚本范围存在,只是没有在参数。也许我只是不明白示波器如何完全工作,谢谢任何帮助和/或澄清。
谢谢你的伟大的探索,现在让我问你这个,如果我使用$ Global:Scope会不会那么糟糕? 99%的时间,我永远不会这样做,但是,这可以追溯到我在https://github.com/dotps1/WinSCP上工作的模块,基本上,首先必须完成的工作是创建一个Session对象,然后每个其他cmdlet都使用它,因此,我的代码如下所示:'$ Global:PSDefaultParameterValues [“* - WinSCP *:WinSCPSession”] = $ session'。我认为这不会影响任何其他cmdlet。再次感谢。 – dotps1
@ dotps1恕我直言,最好允许用户通过h(im | er)self设置'$ PSDefaultParameterValues',如果(s)他想这样做。主要问题,正如我所看到的,你的代码是,有人可以用自定义前缀'Import-Module -Prefix custom'导入你的模块。而你的默认参数不起作用。 – PetSerAl
我倾向于使用的一种解决方法:编写存储脚本范围变量的Get-WinSCPConfig和Set-WinSCPConfig函数,并且可选地序列化磁盘以实现持久“默认”。将这些用作适当功能参数的默认值。执行不力的例子[这里](https://github.com/RamblingCookieMonster/Infoblox)。干杯! –