Не совсем уверен, что вы пытаетесь достичь, но я думаю, что это может помочь вам:
[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
Надеюсь, это поможет