Русские символыpowershell - zabbix_sender - PullRequest
0 голосов
/ 19 января 2019

Отправка данных в zabbix с использованием сценария PS (для LLD):

Переменная $ 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 голосов
/ 23 января 2019

Хотя у меня нет zabbix, я пытаюсь просто выполнить cmd-файл, который не делает ничего, кроме echo %1, я также обнаружил, что chcp 65001 не работает, как ожидалось.

Очевидно, что выполнение chcp 65001 только устанавливает для OutputEncoding консоли *1007* значение 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

То же самое можно сделать для [Console]::InputEncoding, если PowerShell должен получать строки UTF8 из внешних приложений.

Чтобы узнать текущую кодировку для вывода, просто наберите $OutputEncoding в PowerShell.На моей машине это то, что я получаю:

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

Надеюсь, это поможет

...