如何让PowerShell Write-* cmdlets中的控制/不可见字符可见?
让PowerShell的Write-* Cmdlets显示控制/不可见字符
要让PowerShell的Write-Warning、Write-Error等Write-* cmdlets显示原本不可见的控制字符,有两种实用方案:
方案一:自定义转换函数,手动替换控制字符
编写一个函数,将常见控制字符替换为可见转义序列,同时兜底处理未覆盖的控制字符:
function Convert-ToVisibleString { param( [Parameter(Mandatory, ValueFromPipeline)] [string]$InputString ) # 替换常见ASCII控制字符为易读转义符 $visibleStr = $InputString -replace "`t", '\t' ` -replace "`r", '\r' ` -replace "`n", '\n' ` -replace "`v", '\v' ` -replace "`f", '\f' ` -replace "`a", '\a' ` -replace "`b", '\b' # 替换常见Unicode控制字符 $visibleStr = $visibleStr -replace [char]0x200B, '\u200B' ` # 零宽空格(ZWSP) -replace [char]0x200E, '\u200E' ` # 左到右标记(LRM) -replace [char]0x200F, '\u200F' # 右到左标记(RLM) # 处理剩余ASCII控制字符(0x00-0x1F、0x7F) $visibleStr = $visibleStr -replace '[\x00-\x1F\x7F]', { '\x{0:X2}' -f [byte][char]$_.Value } # 处理所有Unicode控制字符(类别Cc) $visibleStr = $visibleStr -replace '\p{Cc}', { $charCode = [int][char]$_.Value if ($charCode -le 0xFF) { '\x{0:X2}' -f $charCode } else { '\u{0:X4}' -f $charCode } } return $visibleStr }
使用示例
# 包含制表符、换行符和零宽空格的测试文本 $cellValue = "`t用户姓名`n$([char]0x200B)张三" Write-Warning ("单元格值: [{0}]" -f (Convert-ToVisibleString $cellValue))
输出效果:
WARNING: 单元格值: [\t用户姓名\n\u200B张三]
方案二:借助ConvertTo-Json自动转义
利用PowerShell的ConvertTo-Json cmdlet自动将所有控制字符转成JSON标准的转义序列,无需手动维护替换规则:
$cellValue = "`t测试文本$([char]0x200B)包含零宽空格" # 转换为JSON后去掉首尾引号 $encodedValue = (ConvertTo-Json $cellValue) -replace '^"|"$', '' Write-Warning ("单元格值: [{0}]" -f $encodedValue)
输出效果:
WARNING: 单元格值: [\t测试文本\u200B包含零宽空格]
方案对比
- 自定义函数:灵活性高,可根据需求调整转义符的显示格式(比如把
t显示为`),适合需要定制输出的场景。 - ConvertTo-Json:无需手动配置,自动覆盖所有JSON支持的转义字符,包括各类Unicode控制字符,省心高效。
内容的提问来源于stack exchange,提问作者SATO Yusuke
相关产品推荐
相关产品推荐

