俄语符号。 powershell-zabbix_sender

时间:2019-01-19 20:20:57

标签: powershell zabbix

使用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
    }
    }

1 个答案:

答案 0 :(得分:0)

尽管我没有zabbix,但尝试自己执行一个仅执行echo %1之后的cmd文件,但我还发现chcp 65001不能按预期工作。

显然,执行chcp 65001仅将控制台的OutputEncoding 设置为UTF-8是不够的。您还必须更改PowerShells自己的$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

希望这会有所帮助