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

如何调用PowerShell函数格式化AD用户手机号?

正确调用PowerShell手机号格式化函数的方法

咱们先排查下你调用失败的可能原因,再给出靠谱的调用姿势:

可能的问题点

你的Format-TelephoneNumber函数对输入的手机号格式有严格的正则匹配要求:必须以+[1-9]\d(比如+44、+1)或者0开头,后面跟着纯数字。如果AD返回的mobile属性不符合这个格式(比如没有国家码前缀、包含括号/横杠等其他符号),函数就会抛出错误。另外,AD的mobile属性也可能返回$null或者空字符串,这同样会导致解析失败。

正确的调用方式

我们可以先对AD获取到的手机号做预处理,再调用函数,同时增加错误捕获逻辑:

# 获取AD用户的手机号
$sysInfo = New-Object -ComObject 'ADSystemInfo'
$userDN = $sysInfo.GetType().InvokeMember('UserName', 'GetProperty', $null, $sysInfo, $null)
$adUser = [ADSI]"LDAP://$($userDN)"
[void][Runtime.InteropServices.Marshal]::FinalReleaseComObject($sysInfo)

$rawMobile = $adUser.mobile.ToString().Trim()
Write-Host "This is raw from AD: $rawMobile" -ForegroundColor Yellow

# 预处理:移除所有非数字和非+的字符,确保输入干净
$cleanedMobile = $rawMobile -replace '[^\d+]'

# 调用格式化函数并捕获错误
try {
    $Formatted = Format-TelephoneNumber -TelephoneNumber $cleanedMobile
    Write-Host "This is processed using Function: $Formatted" -ForegroundColor Green
}
catch {
    Write-Host "Failed to format number: $_" -ForegroundColor Red
}

可选:优化后的格式化函数

如果你的AD里手机号格式五花八门,还可以稍微修改函数,让它兼容更多格式,同时避免索引越界的问题:

Function Format-TelephoneNumber {
    Param (
        [Parameter(ValueFromPipeline = $true, Position = 0)]
        [Alias('Number')]
        [string]$TelephoneNumber,
        [Parameter(Position = 1)]
        [string]$DefaultCountryCode = '+44'
    )
    Process {
        # 先清理所有无关字符:只保留数字和+
        $cleanedNumber = $TelephoneNumber -replace '[^\d+]'
        
        If ($cleanedNumber -match '\A(?<CountryCode>\+[1-9]\d+|0)(?<Number>\d*)\Z') {
            # 处理国家码逻辑
            $countryCode = if ($Matches['CountryCode'] -eq '0') { $DefaultCountryCode } else { $Matches['CountryCode'] }
            
            $numberPart = $Matches['Number']
            $formattedParts = @($countryCode)
            
            # 分段拼接,适配不同长度的号码
            if ($numberPart.Length -ge 3) {
                $formattedParts += $numberPart.Substring(0,3)
                if ($numberPart.Length -ge 6) {
                    $formattedParts += $numberPart.Substring(3,3)
                    $formattedParts += if ($numberPart.Length -ge 9) { $numberPart.Substring(6,3) } else { $numberPart.Substring(6) }
                } else {
                    $formattedParts += $numberPart.Substring(3)
                }
            } elseif ($numberPart.Length -gt 0) {
                $formattedParts += $numberPart
            }
            
            $formattedParts -join ' '
        } Else {
            Write-Error "Unable to parse the string '$TelephoneNumber' as telephone number!"
        }
    }
}

内容的提问来源于stack exchange,提问作者Senior Systems Engineer

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 04:29:50