PowerShell使用Write-Host输出可读格式Azure用户MFA方法属性
问题场景
编写Azure MFA方法重置脚本时,需要以易读格式展示Azure用户对象的StrongAuthenticationMethods属性。
直接在控制台执行变量输出时,能得到格式规整的表格:
$UserPname = Read-Host "Please enter e-mail address" $AzureUser=Get-MsolUser -UserPrincipalName "$UserPname" $methode = $AzureUser.StrongAuthenticationMethods $mfa = $methode | Select-Object MethodType, IsDefault $mfa
输出效果:
MethodType IsDefault ---------- --------- PhoneAppOTP False PhoneAppNotification True
但直接执行Write-Host $mfa时,只会得到无格式的对象拼接字符串,可读性极差:
@{MethodType=PhoneAppOTP; IsDefault=False} @{MethodType=PhoneAppNotification; IsDefault=True}
问题原因
Write-Host的设计逻辑是直接输出字符串内容,不会走PowerShell默认的对象格式化管线。当传入非字符串类型的对象时,会直接调用对象的ToString()方法做转换,因此自定义PSObject会被转成@{属性=值}格式的拼接字符串,丢失默认的表格排版。
可用解决方案
方案1:保留默认表格格式(推荐)
通过Format-Table触发默认格式化逻辑,再用Out-String将排版完成的表格转为字符串,最后传给Write-Host输出,效果和直接调用变量完全一致:
$mfa | Format-Table | Out-String | Write-Host
如果需要调整列宽,可以给Format-Table加-AutoSize参数自动适配列宽:
$mfa | Format-Table -AutoSize | Out-String | Write-Host
方案2:自定义排版输出
如果需要在输出中添加自定义标记(比如标注默认方法),可以遍历结果集手动拼接字符串输出:
Write-Host "`n当前账号绑定的MFA方法如下:" Write-Host "========================================" foreach ($item in $mfa) { $defaultMark = $item.IsDefault ? " *默认方法" : "" Write-Host ("{0,-22} {1,-8}{2}" -f $item.MethodType, $item.IsDefault, $defaultMark) }
输出示例:
当前账号绑定的MFA方法如下: ======================================== PhoneAppOTP False PhoneAppNotification True *默认方法
方案3:调试用结构化输出
如果是脚本调试场景需要看完整属性,可以转成格式化的JSON字符串输出:
$mfa | ConvertTo-Json | Write-Host
注意:
Write-Host仅适合控制台直接打印字符串内容,所有需要保留PowerShell原生格式化效果的输出,都需要先完成格式化、转字符串的步骤再传入,不要直接传递原始对象。
内容的提问来源于stack exchange,提问作者Stan Di
相关产品推荐
相关产品推荐

