You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PowerShell双输入验证问题:验证通过后策略无法应用

Teams PowerShell脚本问题:验证通过后策略未执行

问题说明

我编写了一个PowerShell脚本,用于给Teams租户用户分配电话号码及语音路由策略,流程是先完成两项输入验证,再执行策略应用:

  1. 验证输入的用户ID在租户中真实存在
  2. 验证输入的电话号码符合正则^27\d{9}$格式(以27开头,后跟9位数字,共11位)

目前脚本能正常完成两项验证,但验证通过后,Set-CsPhoneNumberAssignment和Grant-CsOnlineVoiceRoutingPolicy这两个核心策略应用步骤完全未执行,直接跳转至询问是否处理其他用户的环节。

原脚本

Connect-MicrosoftTeams

do {
    try {
    # 验证用户ID
    $upnentry = Read-Host 'Enter the User Principle Name'
    
    # 检查租户中是否存在该用户,不存在则抛出错误
    $csu = Get-CsOnlineUser -Identity $upnentry -ErrorAction Stop
    $csu | Format-List IsSipEnabled, Displ*
    Write-Host 'User ID has been verified correctly!'

   # 验证电话号码格式
   
    $phoneinputblock = {
    try
    {
     [validatescript({[regex]::Match($_,'^27\d{9}$').Length -eq  11})]
     $phoneUserInput = Read-Host "`nEnter Telephone Number"
     $phoneUserInput
     }
     catch{ Write-Warning "Incorrect Format for Telephone Number!"
     & $phoneinputBlock
      }
    }
   $phoneuserInput = & $phoneinputBlock
   Write-Host 'Telephone Number is in the correct format!'

   Set-CsPhoneNumberAssignment -Identity $user -PhoneNumber 
   $phonenumberinput -PhoneNumberType DirectRouting
   Grant-CsOnlineVoiceRoutingPolicy -PolicyName VRP- International -Identity $upnentry
   Write-host "Policies applied successfully for : $upnentry"  - ForegroundColor Green
   }
   catch { Write-Warning "You've entered an invalid UserID: $upnentry"
   }
   } until($Host.UI.PromptForChoice('', 'Do you want to check another Users Profile?', 
   ('&Yes', '&No'), 0))

错误截图

脚本执行错误截图

问题原因及修正方案

1. 变量名错误

  • Set-CsPhoneNumberAssignment中使用了未定义的$user,应替换为已验证的$upnentry
  • 使用了未定义的$phonenumberinput,应替换为用户输入的$phoneuserInput
  • 脚本中$phoneuserInput大小写不一致,虽PowerShell对变量名大小写不敏感,但统一写法更规范

2. 命令换行语法错误

Set-CsPhoneNumberAssignment的参数被拆分在两行,导致PowerShell无法识别完整命令,需将参数放在同一行,或用反引号`(注意是反引号而非单引号)实现合规换行

3. 电话号码验证逻辑错误

原验证逻辑中[regex]::Match($_,'^27\d{9}$').Length -eq 11完全错误:Match方法返回的是Match对象而非字符串,应使用Success属性判断匹配是否成功;另外[ValidateScript()]是属性,不能直接用于变量声明,改用正则匹配验证输入更可靠。

修正后的脚本

Connect-MicrosoftTeams

do {
    try {
        # 验证用户ID
        $upnentry = Read-Host 'Enter the User Principle Name'
        
        $csu = Get-CsOnlineUser -Identity $upnentry -ErrorAction Stop
        $csu | Format-List IsSipEnabled, DisplayName
        Write-Host 'User ID has been verified correctly!'

        # 验证电话号码格式
        do {
            $phoneUserInput = Read-Host "`nEnter Telephone Number"
            # 正则验证格式
            if (-not [regex]::IsMatch($phoneUserInput, '^27\d{9}$')) {
                Write-Warning "Incorrect Format for Telephone Number! Must start with 27 followed by 9 digits (total 11 characters)."
                $validPhone = $false
            } else {
                $validPhone = $true
            }
        } until ($validPhone)
        
        Write-Host 'Telephone Number is in the correct format!'

        # 应用电话号码分配和语音路由策略
        Set-CsPhoneNumberAssignment -Identity $upnentry -PhoneNumber $phoneUserInput -PhoneNumberType DirectRouting
        Grant-CsOnlineVoiceRoutingPolicy -PolicyName "VRP-International" -Identity $upnentry
        Write-Host "Policies applied successfully for : $upnentry" -ForegroundColor Green
    }
    catch { 
        Write-Warning "You've entered an invalid UserID: $upnentry"
    }
} until($Host.UI.PromptForChoice('', 'Do you want to check another Users Profile?', ('&Yes', '&No'), 0))

内容的提问来源于stack exchange,提问作者Dillon

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 19:45:39