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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 17:39:02