PowerShell 5.1与Core 7.1.4输出差异及跨版本兼容运行解决方法问询
问题根因
你遇到的字符间插入大量空格的异常,本质是PowerShell 5.1与Core版本对外部命令输出的默认解码规则不一致导致:Dell uemcli工具的输出编码为UTF-16LE(Windows默认Unicode编码),PowerShell 5.1默认匹配该编码可正常解码,PowerShell Core默认按UTF-8解码UTF-16内容时,会把每个字符的高字节0值解析为空字符,最终表现为字符间插入大量空格。
兼容代码
# 保存当前控制台输出编码,调用结束后恢复避免影响其他逻辑 $originalEncoding = [Console]::OutputEncoding try { # 指定解码编码匹配uemcli的UTF-16LE输出 [Console]::OutputEncoding = [System.Text.Encoding]::Unicode $commandOutput = &"C:\Program Files (x86)\Dell EMC\Unity\Unisphere CLI\uemcli" -d $frame -noHeader /stor/config/pool/sr show } finally { # 恢复原始编码 [Console]::OutputEncoding = $originalEncoding } foreach ($idline in $commandOutput) { # 先清理解码异常产生的空字符,合并连续多空格为单空格 $cleanLine = $idline -replace "`0", "" -replace "\s+", " " if ($cleanLine -match ' ID ') { $subline = $cleanLine.substring(6,($cleanLine.length - 6)) $writeline = $subline.trim() } elseif ($cleanLine -match 'Total pool space used') { $Sleft,$Sright = $cleanLine.Split('(',2) $writeline = $Sleft.trim() } else { $writeline = $cleanLine.trim() } Add-Content -path $outdir\$frame-intrim.txt -value $writeline -Encoding UTF8 }
修改说明
- 显式指定外部命令输出的解码编码,从根源解决字符拆分异常问题,调用后恢复原有编码不影响后续脚本运行
- 增加空字符清理、连续空白合并逻辑,兼容极端场景下的残留异常格式
- 原有业务处理逻辑完全保留,不影响之前的需求实现
- 写入文件统一指定UTF8编码,保证两个版本输出格式一致
内容的提问来源于stack exchange,提问作者Andrew Madsen
相关产品推荐
相关产品推荐

