使用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
}
}
答案 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
希望这会有所帮助