Проблема вложенных функций и параметров Powershell - PullRequest
0 голосов
/ 04 октября 2018

Я пытаюсь использовать две основные функции, которым вы можете передавать другие функции.Например,

. / Script.ps1 -local 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 }
}

1 Ответ

0 голосов
/ 05 октября 2018

Не совсем уверен, что вы пытаетесь достичь, но я думаю, что это может помочь вам:

[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, чтобы вы могли использовать этов качестве параметра, указывающего либо Test1, либо Test2.

Кроме того, в функции RunLocal я поместил внутренние функции над переключателем, поскольку в Powershell необходимо определить функции, прежде чем их можно будет вызывать.

Запустите его с ./script.ps1 -Local -ExecuteLocal Test1

Надеюсь, это поможет

...