Наборы параметров Powershell, как получить один параметр из каждого набора, но не оба? - PullRequest
1 голос
/ 08 июля 2019

Я пытаюсь написать то, что кажется очень простым, но я занимаюсь этим часами и все еще не могу получить то, что мне нужно.

У меня есть скрипт PowerShell, который будет использоваться для запуска или выключения виртуальных машин. Я хочу, чтобы пользователь указал либо имя группы ресурсов, либо отдельное имя виртуальной машины, либо текстовый файл с именами виртуальных машин.

Этот скрипт используется для Azure, но вопрос относится только к объявлению param ().

Я перепробовал каждую комбинацию, которую могу придумать, делая части параметров наборов параметров, делая их обязательными, не обязательными и т. Д., Но я не смог сделать это правильно.

Любая помощь приветствуется!

param (
    [Parameter (Mandatory = $true, ParameterSetName = 'ByResourceGroup')]
    [string]$ResourceGroup,

    [Parameter (Mandatory = $true, ParameterSetName = 'ByFile')]
    [string]$File,

    [Parameter (Mandatory = $true, ParameterSetName = 'ByName')]
    [string]$Name,

    [Parameter (Mandatory = $false, ParameterSetName = 'ByResourceGroup')]
    [Parameter (Mandatory = $false, ParameterSetName = 'ByFile')]
    [Parameter (Mandatory = $false, ParameterSetName = 'ByName')]
    [switch]$Start,

    [Parameter (Mandatory = $false, ParameterSetName = 'ByResourceGroup')]
    [Parameter (Mandatory = $false, ParameterSetName = 'ByFile')]
    [Parameter (Mandatory = $false, ParameterSetName = 'ByName')]
    [switch]$Stop
)

Пользователь должен иметь возможность передавать в ЛИБО: -ResourceGroup ИЛИ ЖЕ -Файл ИЛИ ЖЕ -Имя

И

передать либо: -Начните ИЛИ ЖЕ -Stop

Не оба!

Я думаю, что у меня это правильно для первого сета, но я не могу получить -Start и -Stop как эксклюзивные.

Get-help говорит это:

SYNTAX
    C:\Set-AzureVM.ps1 -ResourceGroup <String> [-Start] [-Stop] [<CommonParameters>]

    C:\Set-AzureVM.ps1 -File <String> [-Start] [-Stop] [<CommonParameters>]

    C:\Set-AzureVM.ps1 -Name <String> [-Start] [-Stop] [<CommonParameters>]


I am looking for something more like this:

SYNTAX
    C:\Set-AzureVM.ps1 -ResourceGroup <String> -Start [<CommonParameters>]

    C:\Set-AzureVM.ps1 -File <String> -Start [<CommonParameters>]

    C:\Set-AzureVM.ps1 -Name <String> -Start [<CommonParameters>]

    C:\Set-AzureVM.ps1 -ResourceGroup <String> -Stop [<CommonParameters>]

    C:\Set-AzureVM.ps1 -File <String> -Stop [<CommonParameters>]

    C:\Set-AzureVM.ps1 -Name <String> -Stop [<CommonParameters>]

Просто чтобы закрыть это ... Я немного изменил это (потребности изменились, и код изменился). Как и предполагали другие, я согласен с тем, что то, что я пытался сделать, вероятно, в любом случае было невозможно. Кроме того, я обрабатываю возможность того, что пользователь выберет и -Start и -Stop или ни один из них в коде. Спасибо всем за ваши комментарии!

SYNTAX
    C:\Set-AzureVM.ps1 -Name <String> -ResourceGroup <String> [-Start] [-Stop] [<CommonParameters>]

    C:\Set-AzureVM.ps1 -File <String> [-Start] [-Stop] [<CommonParameters>]

1 Ответ

2 голосов
/ 08 июля 2019

Я не думаю, что вы пытаетесь сделать это возможно. Вы можете разбить функциональность на два отдельных скрипта.

  • Запуск AzureVM.ps1
  • Стоп-AzureVM.ps1

В качестве альтернативы вы можете использовать переключатель -stop для запуска и остановки. по умолчанию -stop оценивается в $false в вашем скрипте или функции.

# implicitly start the vm
Set-AzureVM.ps1 -Name <String>

# explicitly stop the vm
Set-AzureVM.ps1 -Name <String> -stop
function Set-AzureVM () {
    param(
        [Parameter (Mandatory, ParameterSetName = 'ByFile')]
        [string]$File,

        [Parameter (Mandatory, ParameterSetName = 'ByName')]
        [string]$Name,

        [switch]$Stop
    )
    if($Stop){
        Write-Host 'Stopping VM'
    }
    if(!$stop){
        Write-Host 'Starting VM'
    }
}

Get-Command Set-AzureVM -Syntax
Set-AzureVM -File <string> [-Stop] [<CommonParameters>]

Set-AzureVM -Name <string> [-Stop] [<CommonParameters>]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...