Встраивание параметров в коммутатор - PullRequest
0 голосов
/ 04 октября 2018

У меня есть .ps1, который вызывает файлы, и если он не может вызвать файлы, он будет искать эти файлы локально.Я хотел бы дать возможность, в качестве параметра, либо работать локально, либо извлекать данные из Интернета, а также указывать, какой из 5 файлов использовать или вызывать.Я заставил скрипт работать с «локальной» и «внешней» функцией, но как мне также добавить параметры к этим функциям?

Например:

./script.ps1 -local file1,file2,file3

или

./script.ps1 -external file4,file5

Вот мой код в настоящее время:

Param(
    [Parameter(Position=1)][string]$option
)

function RunLocal {
    Write-Host "local"
}
function RunExternal {
    Write-Host "ext"
}
function RunDefault {
    Write-Host "default"
}

switch ($option) {
    local    { RunLocal }
    external { RunExternal }
    default  { RunDefault }
}

1 Ответ

0 голосов
/ 04 октября 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)]
    [string[]]$Local
)

# ...

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

# Usage:
# script.ps1 [-Default] 'file1', 'file2'
# script.ps1 -External 'file1', 'file2'
# script.ps1 -Local 'file1', 'file2'

Другой вариант будет использовать отдельные параметры для параметра и списка файлов, как JPBlanc предлагается, но в этом случае вы должны проверить параметр -Option, чтобы можно было использовать только разрешенные опции:

[CmdletBinding()]
Param(
    [Parameter(Position=0, Mandatory=$true)]
    [ValidateSet('default', 'external', 'local')]
    [string]$Option,

    [Parameter(Position=1, Mandatory=$true)]
    [string[]]$File
)

# ...

switch ($Option) {
    'local'    { RunLocal }
    'external' { RunExternal }
    'default'  { RunDefault }
}

# Usage:
# script.ps1 'default' 'file1', 'file2'
# script.ps1 -Option 'default' -File 'file1', 'file2'
# script.ps1 'external' 'file1', 'file2'
# script.ps1 -Option 'external' -File 'file1', 'file2'
# script.ps1 'local' 'file1', 'file2'
# script.ps1 -Option 'local' -File 'file1', 'file2'
...