如何调用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
相关产品推荐
相关产品推荐

