【问题标题】:Powershell parameter validation without throwing exceptionPowershell参数验证不抛出异常
【发布时间】:2014-07-10 20:37:54
【问题描述】:

我有一个这样的 Powershell 脚本

    Param(
   [Parameter(Mandatory=$True,Position=1)]
   [string]$variable1,

   [Parameter(Mandatory=$True,Position=2)]
   [string]$variable2,

   [Parameter(Mandatory=$True,Position=3)]
   [int]variable3
   )... something happens then

现在我想在继续执行脚本之前检查变量 1 是否为 A、B 或 C 变量 2 是否为 D、E 或 F 而变量 3 是否为 1、4、5

是否有可能在输入后立即检查参数?所以如果 variable1 出错你必须重做它,但如果 variable2 有一个错误你只需要重做 variable2 而不是 variable1?

【问题讨论】:

    标签: powershell parameters


    【解决方案1】:

    使用ValidateSet 属性指定可接受的值。

    来自帮助文档about_Functions_Advanced_Parameters

    ValidateSet Attribute
        The ValidateSet attribute specifies a set of valid values for a 
        parameter or variable. Windows PowerShell generates an error if a
        parameter or variable value does not match a value in the set. In
        the following example, the value of the Detail parameter can only
        be "Low," "Average," or "High."
    
       Param
          (
            [parameter(Mandatory=$true)]
            [ValidateSet("Low", "Average", "High")]
            [String[]]
            $Detail
          ) 
    

    【讨论】:

    • 好的,但它只是抛出异常并退出脚本,而不是要求用户重新输入错误的参数
    【解决方案2】:
    function testFunc{
        Param(
        [Parameter(Mandatory=$True,Position=1)]
        $variable1,
    
        [Parameter(Mandatory=$True,Position=2)]
        $variable2,
    
        [Parameter(Mandatory=$True,Position=3)]
        $variable3)
    
        $acceptable1 = @("A", "B", "C")
        $acceptable2 = @("D", "E")
        $acceptable3 = @(1, 2, 3)
    
        while((-Not($acceptable1.Contains($variable1))) -or (-Not($acceptable2.Contains($variable2))) -or (-Not($acceptable3.Contains($variable3)))){
            if (-Not($acceptable1.Contains($variable1))){
                $variable1 = Read-Host "Please re-enter Variable1"
            }
            if (-Not($acceptable2.Contains($variable2))){
                $variable2 = Read-Host "Please re-enter Variable2"
            }
            if (-Not($acceptable3.Contains($variable3))){
                $variable3 = Read-Host "Please re-enter Variable3" 
                if([int]$variable3 -eq [double]$variable3){
                    $variable3 = [int] $variable3
                }
            }
        }
    }
    

    不是最优雅的,但它确实有效。

    我定义了 3 组可接受的输入,然后对照该组进行检查。它将继续循环,直到每个输入都正确。由于 Read-Host 接受字符串,我检查了 int 转换是否等于双重转换,然后将变量设置为该 int。

    这只会提示按照您的指定更正不正确的输入。

    【讨论】:

      猜你喜欢
      • 2012-09-10
      • 1970-01-01
      • 1970-01-01
      • 2014-05-20
      • 1970-01-01
      • 2013-04-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多