我有一个高级函数,在.ps1脚本文件中有许多辅助函数。
如何组织我的函数以便我可以从命令行调用AdvFunc,而不会破坏AdvFunc使用辅助函数的能力?
script.ps1的缩写内容:
Function AdvFunc {
[cmdletbinding(DefaultParameterSetName='Scheduled')]
Param (
[Parameter(ValueFromPipeline=$true, ParameterSetName='Scheduled')]$SomeValue
)
Begin {
$value = Helper1 $stuff
}
Process {
# do stuff
}
End {
# call Helper2
}
}
Helper1 {
Param ($stuff)
# do stuff
Return $valueForAdvFunc
}
Helper2 {
# do other stuff
}
# Entry Point
$collection | AdvFunc
script.ps1当前由调度程序启动,并按预期处理预定义的$ collection。
问题是我需要从命令调用AdvFunc,就像使用不同的参数集一样。我在下面添加了AdHoc
参数集。这将用于向AdvFunc发送不同的集合。据我所知,这意味着script.ps1的第一行现在需要是:
Param (
[Parameter(ValueFromPipeline=$true, ParameterSetName='Scheduled')]$SomeValue,
[Parameter(ParameterSetName='AdHoc')][string]$OtherValue1,
[Parameter(ParameterSetName='AdHoc')][string]$OtherValue2
)
显然这意味着辅助函数不能再在同一个.ps1文件中。
这是否意味着我现在需要 3个脚本文件,每个根据需要点源另一个?
我应该使用: script.ps1 (仅包含AdvFunc), helpers.ps1 (包含多个辅助函数)和 collection.ps1 (只有$ collection被传送到script.ps1)?
还有其他选择吗?
答案 0 :(得分:1)
建议的解决方案:使用源脚本.ps1的启动器脚本。所有函数(AdvFunc和所有辅助函数)都驻留在script.ps1中。
# launcher.ps1
[cmdletbinding(DefaultParameterSetName='Scheduled')]
Param (
[Parameter(ParameterSetName='AdHoc', Mandatory=$true)][ValidateNotNullOrEmpty()][string]$Param1,
[Parameter(ParameterSetName='AdHoc', Mandatory=$true)][ValidateNotNullOrEmpty()][string]$Param2,
[Parameter(ParameterSetName='AdHoc', Mandatory=$true)][ValidateNotNullOrEmpty()][string]$Param3
)
. .\script.ps1
if ($PSBoundParameters.ContainsKey('param1')) {
AdvFunc -Param1 $Param1 -Param2 $Param2 -Param3 $Param3
}
else {
$collection | AdvFunc
}
这个想法是容纳无参数(向AdvFunc发送$collection
)或完整的AdHoc'参数集(将命令行定义的集合发送到AdvFunc)。空的'预定'可能不需要参数集来容纳无参数选项。