Функция Powershell - параметр должен быть обязательным в одном случае, необязательным в другом - PullRequest
0 голосов
/ 28 ноября 2018

У меня есть эта функция:

function AlwaysRunAtLogon {
    [CmdletBinding()]
    param (
        [Parameter(Mandatory=$true)]
        [System.String]$NomTache,
        [Parameter(Mandatory = $true)]
        [System.String]$Script,
        [switch]$retrait

    )

...
}

Вариант использования # 1:

AlwaysRunAtLogon -NomTache AnyName C:\temp\script.ps1

, который будет запускать код для ДОБАВЛЕНИЯ чего-либо.Это работает нормально.Теперь я хочу добавить параметр SWITCH в свою функцию, чтобы он мог УДАЛИТЬ что-либо, основываясь на значении первого параметра (NomTache)

Так что вариант использования # 2 будет:

AlwaysRunAtLogon -NomTache AnyName -Retrait

Теперь вот проблема.В случае № 1 я хочу оставить обязательным $ Script, чтобы пользователь ДОЛЖЕН предоставить файл сценария.Однако в случае № 2 $ Script теперь является необязательным, поскольку для операций удаления требуется только первый параметр (NomTache)

Как мне адаптировать эту функцию, чтобы я мог использовать оба варианта 1 и 2?Возможно, где-то есть логическая проблема.Я новичок в функциях, так что спасибо за вашу помощь.Я открыт для любого редизайна.

Мне лучше сделать другую функцию, например «RemoveAlwaysRunAtLogon», и запустить ее так?:

RemoveAlwaysRunAtLogon -NomTache AnyName

Ответы [ 2 ]

0 голосов
/ 29 ноября 2018

Работает так благодаря vrdse выше:

function AlwaysRunAtLogon {

    [CmdletBinding()]

    param (

        [Parameter(ParameterSetName='Ajout',Mandatory=$true)]

        [Parameter(Position=0,ParameterSetName='Retrait',Mandatory=$true)]
        [System.String]$Nom,


        [Parameter(Position=1,ParameterSetName='Ajout',Mandatory = $true)]
        [System.String]$Script,

        [Parameter(ParameterSetName='Retrait')]

        [switch]$retrait

        )

    ....

}
0 голосов
/ 28 ноября 2018

Вы можете решить свою проблему с помощью ParameterSets.

Не уверен, что я полностью понял ваше требование, так что это всего лишь пример.Но я думаю, что модель ясна.

function AlwaysRunAtLogon {
    [CmdletBinding()]
    param (
        [Parameter(
            ParameterSetName='Name1',
            Mandatory=$true
        )]
        [Parameter(
            ParameterSetName='Name2',
            Mandatory=$true
        )]
        [System.String]$NomTache,
        [Parameter(
            ParameterSetName='Name1',
            Mandatory = $true
        )]
        [System.String]$Script,
        [Parameter(
            ParameterSetName='Name2'
        )]
        [switch]$retrait

    )

...
}
...