俄罗斯符号。电源外壳-zabbix_sender

Russian symbols. powershell - zabbix_sender

使用PS脚本(对于LLD)将数据发送到zabbix:

$Name 变量由俄文字母组成,以空格分隔。

"$zhost$zkey$Json" | Write-Host - 用俄语字符显示正确的 JSON 并且在 zabbix 中出现“?????? ???? ???? ????”显然,编码在某处损坏,我不明白在哪里以及如何修复它。

求求你帮忙

$ARCHIVEPATH="D:\Work\apdex"
$zsender="D:\Work\apdex\zabbix\zabbix_sender.exe"
$zconfig="D:\Work\apdex\zabbix\zabbix_agentd.win.conf"
$zhost="UPP_Apdex"
$zkey="uids.discovery"
$zparams=@("-c", '"D:\Work\apdex\zabbix\zabbix_agentd.win.conf"')
$zparams=$zparams+@(
    "-i", "-", "-v"
  )
Get-ChildItem "$ARCHIVEPATH" -Filter *.xml | Sort-Object -Property LastWriteTime, Name |
    Foreach-Object {
        $sSourceFile = "$ARCHIVEPATH$_" 
        $oXmlDocument = New-Object -TypeName System.Xml.XmlDocument
        $oXmlDocument.load($sSourceFile)
        $oXmlDocument.Performance.KeyOperation |
        ForEach-Object -Process {
            $Uid = $_.Uid
            $Name = $_.Name
            $Target = $_.targetValue
                $Json = @{
    'data' = @(
            @{
                '{#OPERKEY}' = $Uid;
                '{#OPERNAME}' = $Name
            }
        )

}
            $Json=($Json | ConvertTo-Json -Compress)
            "$zhost $zkey $Json" | Write-Host
            "$zhost $zkey $Json" | & $zsender $zparams
    }
    }

虽然我没有 zabbix,但我自己尝试简单地执行一个 cmd 文件,然后 echo %1,我还发现 chcp 65001 没有按预期工作。

显然,执行 chcp 65001 仅将 控制台的 OutputEncoding 设置为 UTF-8,这是不够的。您还必须更改 PowerShell 自己的 $OutputEncoding(隐含地也使用 chcp 65001)。

为了使 PowerShell 在与外部实用程序通信时使用 UTF-8,以下代码对我有用:

$oldOutputEncoding = $OutputEncoding
$oldConsoleEncoding = [Console]::OutputEncoding

# change the output encoding to use UTF-8
$OutputEncoding = New-Object System.Text.Utf8Encoding
[Console]::OutputEncoding = New-Object System.Text.Utf8Encoding

$oldConsoleEncoding

# This is where your zabbix related code goes to finally execute the zabbix_sender.exe 
# In my test case I'm just running a cmd file that does nothing more then echo the input parameter back to console.
& "D:\blah.cmd" "русский"

# switch back to the original output encoding whe finished
$OutputEncoding = $oldOutputEncoding
[Console]::OutputEncoding = $oldConsoleEncoding

如果 PowerShell 要从外部应用程序接收 UTF8 字符串,[Console]::InputEncoding 也可以这样做。

您只需在 PowerShell 中键入 $OutputEncoding 即可查看当前的输出编码。在我的机器上,这是我得到的:

IsSingleByte      : True
BodyName          : iso-8859-1
EncodingName      : West-Europees (Windows)
HeaderName        : Windows-1252
WebName           : Windows-1252
WindowsCodePage   : 1252
IsBrowserDisplay  : True
IsBrowserSave     : True
IsMailNewsDisplay : True
IsMailNewsSave    : True
EncoderFallback   : System.Text.InternalEncoderBestFitFallback
DecoderFallback   : System.Text.InternalDecoderBestFitFallback
IsReadOnly        : True
CodePage          : 1252

执行 $OutputEncoding = New-Object System.Text.Utf8Encoding 后显示如下:

BodyName          : utf-8
EncodingName      : Unicode (UTF-8)
HeaderName        : utf-8
WebName           : utf-8
WindowsCodePage   : 1200
IsBrowserDisplay  : True
IsBrowserSave     : True
IsMailNewsDisplay : True
IsMailNewsSave    : True
IsSingleByte      : False
EncoderFallback   : System.Text.EncoderReplacementFallback
DecoderFallback   : System.Text.DecoderReplacementFallback
IsReadOnly        : True
CodePage          : 65001

希望对您有所帮助