0

所以我试图使变量与在 azure CLI 中创建虚拟机的密码要求相匹配

为此,它必须具有以下 3 个!大写、1 个小写、1 个特殊字符或数字

这是我要更改的主要代码

$AdminPassword = Read-Host -Prompt "Please insert a Admin Password (Password must have 3 of the following: 1 lower case character, 1 upper case character, 1 number and 1 special character)"

这是我更改但无法正常工作的代码

do 
    {
        $AdminPassword = Read-Host -Prompt "Please insert a Admin Password (Password must have the 3 of the following: 1 lower case character, 1 upper case character, 1 number and 1 special character)"
    }
    until($AdminPassword -Like "[A-Z][A-Z][A-Z][a-z][a-z][a-z][0-9][0-9][0-9][!@$#$%^&*()_+\-=\[\]{};'':"\\|,.<>\/? ][!@$#$%^&*()_+\-=\[\]{};'':"\\|,.<>\/? ][!@$#$%^&*()_+\-=\[\]{};'':"\\|,.<>\/? ]")
    Write Match

用写匹配线我知道它什么时候成功

我在这里遇到的真正麻烦是我想要所有 4 个要求 3 次,所以 3 个大写字母 3 个小写字母等等,我也想要特殊字符,但 # 注释所有代码像这样

提前感谢您阅读本文并发布您的答案!!!

4

2 回答 2

3

我不确定这是否可以只用一个正则表达式来完成。作为替代方案,在一个小的帮助函数下方进行测试。

function Test-AdminPassword {
    [CmdletBinding()]
    Param(
        [Parameter(Position = 0, Mandatory=$true)]
        [string]$Password,

        [Parameter(Position = 1)]
        [int]$Requirements = 5
    )
    $result = 0

    # test length between 12 and 24
    if ($Password.Length -in 12..24) {
        $result++
    }
    # test uppercase
    if (($Password -creplace '[^A-Z]', '').Length -ge 3) {
        $result++
    }
    # test lowercase
    if (($Password -creplace '[^a-z]', '').Length -ge 3) {
        $result++
    }
    # test digits
    if (($Password -replace '[^0-9]', '').Length -ge 3) {
        $result++
    }
    # test special characters
    if (($Password -creplace '[^!@$#%^&*()_+\-=\[\]{};'':"\\|,.<>\/? ]', '').Length -ge 3) {
        $result++
    }

    # return $true if the password complies with at least $requirements
    return ($result -ge $Requirements)
}

do {
    $AdminPassword = Read-Host -Prompt "Please insert an Admin Password (must have the 3 lower case characters, 3 upper case characters, 3 digits and 3 special characters)"
} until (Test-AdminPassword $AdminPassword)
于 2018-10-16T15:21:41.367 回答
1

对于特殊字符,正则表达式应该是下面代码中的那个。

您需要为正则表达式使用单引号:

do
{
$s=Read-Host -Prompt "please enter a password"
}
until($s -like '[A-Z][A-Z][A-Z][a-z][a-z][a-z][0-9][0-9][0-9][!@$#$%^&*()_+\-\=`[`]{};'':`"\\|,.<>\/? ][!@$#$%^&*()_+\-\=`[`]{};'':`"\\|,.<>\/? ][!@$#$%^&*()_+\-\=`[`]{};'':`"\\|,.<>\/? ]')

write-host "complete entering password"

测试结果如下: 在此处输入图像描述

于 2018-10-16T15:51:03.093 回答