0

我通过使用 Read-Host 在 PowerShell 中将用户输入限制为电子邮件地址或域\ID 来执行 Do Until 循环。条件不起作用。

原始语法:

do { $answer = Read-Host "yes or no" } until ("yes","no" -contains $answer)

输入:

$DL1 = "HH@domain.com"
$DL2 = "domain\HH"
$Restriction1 = $DL1.EndsWith('@domain.com')
$Restriction2 = $DL2.StartsWith('domain\')
Output:
True

实际命令:

Do {$DLO= Read-Host "Enter ID (Email Address or Domain\ID)"}
until ($DLO.EndsWith('@domain.com'),$DLO.StartsWith('Domain\') -match 'true' )

为什么条件不起作用?

4

1 回答 1

0

您的版本失败的原因是您while从源代码更改了测试的基本结构。.StartsWith()另外,您忽略了和.EndsWith()区分大小写的事实。最后一个意思是domainDomain不是一回事。[咧嘴笑]

我没有解开这个问题,而是以一种对我来说似乎更明显的方式重写了这个想法。

它能做什么 ...

  • 创建常量
  • 创建测试字符串
    的正则表达式转义版本,以斜杠结尾的版本如果不转义将无法工作,因为这是一个保留字符。由于点是正则表达式模式语言中的“任何字符”,因此以结尾的那个.com不会总是工作而不转义。
  • 将输入变量设置为空字符串
  • 开始一个while循环
  • 测试一个null or empty字符串
  • 获取用户输入
  • if测试域 id
  • elseif测试电子邮件地址
  • else写入警告并将输入 $Var 设置为空白字符串
  • while循环退出后,显示$RHInput变量 的内容

编码 ...

$DomainName = 'Ziggity'
$EmailSuffix = '@{0}.com' -f $DomainName
$ES_Regex = [regex]::Escape($EmailSuffix)
$UserNamePrefix = '{0}\' -f $DomainName
$UNP_Regex = [regex]::Escape($UserNamePrefix)

$RHInput = ''
while ([string]::IsNullOrEmpty($RHInput))
    {
    $RHInput = Read-Host ('Enter an ID [ UserName@{0} or {1}UserName ] ' -f $EmailSuffix, $UserNamePrefix)
    if ($RHInput -match "^$UNP_Regex")
        {
        'You entered a domain ID [ {0} ]' -f $RHInput
        }
        elseif ($RHInput -match "$ES_Regex$")
        {
        'You entered an email address [ {0} ]' -f $RHInput
        }
        else
        {
        Write-Warning (    '[ {0} ] is not a valid email address OR a valid domain ID.' -f $RHInput)

        $RHInput = ''
        }
    }

''
$RHInput

while... 中输出

# 1st run thru
Enter an ID [ UserName@@Ziggity.com or Ziggity\UserName ] : testing@ziggity.com
You entered an email address [ testing@ziggity.com ]

# 2nd run thru
Enter an ID [ UserName@@Ziggity.com or Ziggity\UserName ] : testing\tutu
WARNING: [ testing\tutu ] is not a valid email address OR a valid domain ID.
Enter an ID [ UserName@@Ziggity.com or Ziggity\UserName ] : ziggity\testing
You entered a domain ID [ ziggity\testing ]

while循环 后输出...

# 1st run thru
testing@ziggity.com

# 2nd run thru
ziggity\testing
于 2020-05-14T04:02:30.390 回答