Powershell嵌套函数和参数问题

问题描述 投票:0回答:1

我正在尝试将两个主要功能传递给其他功能。例如

./script.ps1-本地test1,test2

这是我的代码,-local工作,并在之后请求另一个输入,但它实际上不输出test1。

[CmdletBinding(DefaultParameterSetName='default')]
Param(
    [Parameter(ParameterSetName='default', Position=0, Mandatory=$true)]
    [string[]]$Default,

    [Parameter(ParameterSetName='external', Position=0, Mandatory=$true)]
    [string[]]$External,

    [Parameter(ParameterSetName='local', Position=0, Mandatory=$true)]
    [string[]]$Local
)

function RunLocal {
    switch ($PSCmdlet.ParameterSetName) {
        'Test1'  { Test1 }
        'Test2' { Test2 }
        }
        function Test1 {Write-Host "Test1"}
        function Test2 {Write-Host "Test2"}
    }
function RunExternal {}
function RunDefault {}

switch ($PSCmdlet.ParameterSetName) {
    'local'    { RunLocal }
    'external' { RunExternal }
    'default'  { RunDefault }
}
powershell powershell-v2.0 powershell-v3.0
1个回答
0
投票

不太清楚你想要完成什么,但我认为这可能会让你前进:

[CmdletBinding(DefaultParameterSetName='default')]
Param(
    [Parameter(ParameterSetName='default', Position=0, Mandatory=$true)]
    [string[]]$Default,

    [Parameter(ParameterSetName='external', Position=0, Mandatory=$true)]
    [string[]]$External,

    [Parameter(ParameterSetName='local', Position=0, Mandatory=$true)]
    [switch]$Local,

    [Parameter(ParameterSetName='local', Position=1, Mandatory=$false)]
    [ValidateSet ('Test1','Test2')]
    [string]$ExecuteLocal = 'Test1'
)

function RunLocal {
    [CmdletBinding()]
    Param(
        [Parameter(Position=0, Mandatory=$false)]
        [ValidateSet ('Test1','Test2')]
        [string]$Execute = 'Test1'
    )

    function Test1 {Write-Host 'Running Local -> Test1'}
    function Test2 {Write-Host 'Running Local -> Test2'}

    switch ($Execute) {
        'Test1'  { Test1 }
        'Test2'  { Test2 }
    }
}

function RunExternal {Write-Host 'Running External'}
function RunDefault  {Write-Host 'Running Default'}

switch ($PSCmdlet.ParameterSetName) {
    'local'    { RunLocal -Execute $ExecuteLocal }
    'external' { RunExternal }
    'default'  { RunDefault }
}

正如您所看到的,我已将ValidateSet添加到Local函数中,因此您可以将其用作表示Test1Test2的参数。

此外,在函数RunLocal中,我已将内部函数放在开关上方,因为在Powershell函数中需要先定义函数才能调用它们。

./script.ps1 -Local -ExecuteLocal Test1运行它

希望这可以帮助

© www.soinside.com 2019 - 2024. All rights reserved.