如何将函数组织成脚本文件以允许从命令行调用?

时间:2016-10-16 21:20:42

标签: function powershell powershell-v4.0

我有一个高级函数,在.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)?

还有其他选择吗?

1 个答案:

答案 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)。空的'预定'可能不需要参数集来容纳无参数选项。