【问题标题】:Powershell function - parameter has to be mandatory in one case, optional in anotherPowershell函数-参数在一种情况下必须是强制性的,在另一种情况下是可选的
【发布时间】:2018-11-28 19:50:50
【问题描述】:

我有这个功能:

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

【问题讨论】:

    标签: function powershell parameters switch-statement


    【解决方案1】:

    您可以通过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
    
        )
    
    ...
    }
    

    【讨论】:

    • 请参阅下面的答案,我更改了格式,这样看起来更容易,但我得到了您的建议。我想了解到底发生了什么。你能解释一下逻辑吗?
    • Jeffrey SnoverEd Wilson 已经解释过了。 ;)
    【解决方案2】:

    感谢上面的 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
    
            )
    
        ....
    
    }
    

    【讨论】:

      猜你喜欢
      • 2017-02-01
      • 2017-08-09
      • 1970-01-01
      • 2020-09-06
      • 2020-02-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-19
      相关资源
      最近更新 更多