代码之家  ›  专栏  ›  技术社区  ›  Rakha

PowerShell函数-参数在一种情况下必须是必需的,在另一种情况下是可选的

  •  0
  • Rakha  · 技术社区  · 6 年前

    我有这个功能:

    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
    

    它将运行代码来添加一些内容。这个很好用。现在我想给我的函数添加一个开关参数,这样它就可以根据第一个参数的值(nomatches)删除一些内容。

    所以用例2应该是:

    AlwaysRunAtLogon -NomTache AnyName -Retrait
    

    现在问题来了。在案例1中,我想让$script成为强制的,所以用户必须提供一个脚本文件。但是,在案例2中,$script现在是可选的,因为删除操作只需要第一个参数就可以工作(nomatche)

    我如何调整这个函数,以便同时使用用例1和2?在某个地方可能有逻辑问题。我是新来的,谢谢你的帮助。我愿意接受任何重新设计。

    我是不是最好做另一个函数,例如“removealwaysrunatlogon”,然后像这样运行它?:

    RemoveAlwaysRunAtLogon -NomTache AnyName
    
    2 回复  |  直到 6 年前
        1
  •  2
  •   vrdse    6 年前

    你可以用 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
    
        )
    
    ...
    }
    
        2
  •  0
  •   Rakha    6 年前

    由于上面的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
    
            )
    
        ....
    
    }