【问题标题】:Powershell validate inputPowershell 验证输入
【发布时间】:2016-02-18 13:27:35
【问题描述】:

我正在尝试验证 powershell 中的一些输入。 用户应输入新 AD 用户的用户名。应验证此用户名是否存在任何无效字符(例如!、$、; 等)。 有效字符为 a-z(上下)、0-9、_、- 和 ,

感谢您的帮助。

目前我的代码如下所示:

do{

    $input="notok"
    # Eingabe es Usernamen
    Write-Host "Bite den Usernamen eingeben"
    $Username = Read-Host


    if ($Username -notmatch "[a-zA-Z0-9_.-]") {
        Write-Host ""
        Write-Host "ACHTUNG: Benutzer $Username enthaelt ungueltige Zeichen (nur a-z, A-Z, 0-9, ., - und _ erlaubt), bitte die Eingabe wiederholen" -ForegroundColor Red
        Write-Host ""
        $input="notok"

    }else{

        $input="ok"

    }

}while($input -ne "ok")

【问题讨论】:

    标签: validation powershell match limit


    【解决方案1】:

    您可以使用参数,并使用内置的参数验证:

    Param(
      [Parameter(Mandatory=$false,ValueFromPipeline=$true)] 
      [ValidateScript({$_-match "^[a-zA-Z0-9_\-,]+$"})] 
      [String]
      $Username
    )
    

    【讨论】:

    • 这是假设他正在使用我同意的函数,但您的正则表达式仅检查是否包含这些字符中的任何一个,而不是所有字符都与表达式匹配。你需要我发布的那个。
    • [ValidateScript({$_-match "^[a-z0-9_.-]*$"})]
    • @Deadly-Bagel - 它不需要是一个函数,你也可以使用参数,它只是一个直接的 .ps1 脚本
    • 呵呵,每天都学点新东西。您需要 Mandatory 参数才能在脚本中途提示您。
    • 使用参数验证是一个优雅的解决方案;需要注意的是,不幸的是,您无法控制输出的错误消息(据我所知),并且该消息对于最终用户来说可能技术性太强,因为原始脚本块被打印。除此之外:在手头的情况下,更简单的ValidatePattern 属性就足够了:[ValidatePattern('^[a-zA-Z0-9_.-]$')]
    【解决方案2】:

    试试这个:

    do{
    
        $input="notok"
        # Eingabe es Usernamen
        Write-Host "Bite den Usernamen eingeben"
        $Username = Read-Host
    
    
        if ($Username -notmatch "^[a-z0-9_.-]*$") {
            Write-Host ""
            Write-Host "ACHTUNG: Benutzer $Username enthaelt ungueltige Zeichen (nur a-z, A-Z, 0-9, ., - und _ erlaubt), bitte die Eingabe wiederholen" -ForegroundColor Red
            Write-Host ""
            $input="notok"
    
        }else{
    
            $input="ok"
    
        }
    
    }while($input -ne "ok")
    

    【讨论】:

    • No prob =) 虽然如果您正在使用函数,您应该查看 Campbell 的答案,但这是一种更简洁的方法。当然,如果脚本进行到一半,您将不得不坚持下去。
    • 很好,但请添加解释(您已经在@campbell.rw 的答案的评论中给出的解释)。
    • Regex 并不是我真正的东西,但您所拥有的只是询问这些字符中是否有任何字符在 $Username 中。使用 "^[a-z0-9_.-]*$" 代替(最值得注意的是之前的 ^ 和之后的 *$)表示所有字符都必须匹配。
    • 确实,这是正确的解释,我希望您添加到您的答案中,因为没有多少人关注cmets。就目前而言,您的代码和 OP 之间的唯一区别是添加了 ^$,这虽然很重要,但目前并不明显。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-17
    • 2014-12-04
    • 1970-01-01
    • 2014-03-25
    • 2012-01-31
    相关资源
    最近更新 更多