俄罗斯符号。电源外壳-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
希望对您有所帮助
使用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
希望对您有所帮助