Получаю имя служб PS скриптом, в консоли сервера русские имена служб выводятся нормально, но выполняя этот скрипт через zabbix_get вся кириллица превращается в каракозябры, как победить?
Ad Widget
Collapse
Кириллица и json
Collapse
X
-
Tags: None
-
-
Comment
-
| iconv -f cp866 -t UTF-8
Вот так получилось. Спасибо!
Теперь вопрос, как мне это через UserParameter передать?
UserParameter=service.discovery,powershell -File "C:\Program Files\zabbix\servicediscovery.ps1"Last edited by xeonkeeper; 02-06-2015, 17:11.Comment
-
или вызов iconv внутрь servicediscovery.ps1 упаковатьCode:UserParameter=service.discovery,powershell -File "C:\Program Files\zabbix\servicediscovery.ps1" | iconv -f cp866 -t UTF-8
Comment
-
первый способ не работает, пишет в консоли
А второй это прописать iconv внутрь скрипта?Code:"iconv" ▒▒ ▒▒▒▒ ▒▒▒▒७▒▒▒ ▒▒▒ ▒▒▒譥▒ ▒▒▒▒▒▒▒▒, ▒ᯮ▒▒塞▒▒ ▒ணࠬ▒▒▒ ▒▒▒ ▒▒▒▒▒▒ 䠩▒▒▒.
Comment
-
В общем, чтобы было понятнее вот сам скрипт
Code:$colItems = Get-WmiObject Win32_Service | where-object { $_.StartMode -ne 'Disabled' } Write-Host "{"; write-host "`t ""data"":["; write-host $temp = 1 foreach ($objItem in $colItems) { $exe_dir = $objItem.PathName $exe_dir = $exe_dir -replace '\s.*$','' $exe_dir = $exe_dir -replace '"?(.+\\).+exe.*$','$1' $exe_dir = $exe_dir -replace '\\','/' $exe_dir = $exe_dir -replace '"','' $desc_val = $objItem.Description #$desc_val = ” – ” $desc_val = $desc_val -replace '\"','@' if ($temp -eq 0){ Write-Host ","; } else{ $temp = 0; } $line = " { `"{#SERVICESTATE}`":`"" + $objItem.State + "`", `"{#SERVICEDISPLAY}`":`"" + $objItem.DisplayName + "`", `"{#SERVICENAME}`":`"" + $objItem.Name + "`", `"{#SERVICEDESC}`":`"" + $desc_val + "`", `"{#SERVICEDIR}`":`"" + $exe_dir + "`" }" Write-Host -NoNewline $line } write-host write-host write-host "`t ]"; write-host "}"Comment
-
и добавляем вызов функции например в эту строкуCode:function ConvertTo-Encoding ([string]$From, [string]$To){ Begin{ $encFrom = [System.Text.Encoding]::GetEncoding($from) $encTo = [System.Text.Encoding]::GetEncoding($to) } Process{ $bytes = $encTo.GetBytes($_) $bytes = [System.Text.Encoding]::Convert($encFrom, $encTo, $bytes) $encTo.GetString($bytes) } }Code:$line = " { `"{#SERVICESTATE}`":`"" + $objItem.State + "`", `"{#SERVICEDISPLAY}`":`"" + $objItem.DisplayName + "`", `"{#SERVICENAME}`":`"" + $objItem.Name + "`", `"{#SERVICEDESC}`":`"" + $desc_val + "`", `"{#SERVICEDIR}`":`"" + $exe_dir + "`" }" | ConvertTo-Encoding "CP866" "UTF-8"Comment
-
тык! Консоль у вас cp866, а вы выдаете utf8. Естественно что в консоли оно и не должно сработать, попробуйте значения через zabbix_get с сервера получить.Comment
-
Comment
-
Спасибо! Работает!и добавляем вызов функции например в эту строкуCode:function convertto-encoding ([string]$from, [string]$to){ begin{ $encfrom = [system.text.encoding]::getencoding($from) $encto = [system.text.encoding]::getencoding($to) } process{ $bytes = $encto.getbytes($_) $bytes = [system.text.encoding]::convert($encfrom, $encto, $bytes) $encto.getstring($bytes) } }Code:$line = " { `"{#servicestate}`":`"" + $objitem.state + "`", `"{#servicedisplay}`":`"" + $objitem.displayname + "`", `"{#servicename}`":`"" + $objitem.name + "`", `"{#servicedesc}`":`"" + $desc_val + "`", `"{#servicedir}`":`"" + $exe_dir + "`" }" | convertto-encoding "cp866" "utf-8"Comment
-
Всем добрый день!
Тоже проблема с передачей кириллицы на Zabbix-сервер. Мой скрипт:
В PS-консоли сервера выдает:Code:param( [Parameter(Mandatory=$False)] [string]$QueryName, [string]$CSV_NAME ) if ($QueryName -eq '') { $csvs = Get-Cluster | Get-ClusterSharedVolume write-host "{" write-host " `"data`":[" write-host foreach ($csv in $csvs) { if ($csv -ne $csvs[-1]) { $line = " { `"{#CSV_NAME}`":`"" + $CSV.Name + "`" }," } else { $line = " { `"{#CSV_NAME}`":`"" + $CSV.Name + "`" }" } write-host $line } write-host write-host " ]" write-host "}" write-host } else { $csv = Get-Cluster | Get-ClusterSharedVolume | Where-Object {$_.Name -Match "$CSV_NAME"} switch ($QueryName) { ('Status') {$Results = $CSV.State} ('Owner') {$Results = $CSV.Node} default {$Results = "Incorrect Command Given"} } $Results = $Results | Out-String $Results = $Results.trim() Write-Host $Results }
В консоли Zabbix-сервера результат zabbix-get в виде квадратиков вместо русских букв, причем количество квадратиков не совпадает с количеством русских букв.Code:{ "data":[ { "{#CSV_NAME}":"Диск кластера 2" }, { "{#CSV_NAME}":"Диск кластера 3" } ] }
Добавление вышеуказанной функции перекодировки в скрипт
ломает вывод даже в консоли PS:Code:param( [Parameter(Mandatory=$False)] [string]$QueryName, [string]$CSV_NAME ) function convertto-encoding ([string]$from, [string]$to){ begin{ $encfrom = [system.text.encoding]::getencoding($from) $encto = [system.text.encoding]::getencoding($to) } process{ $bytes = $encto.getbytes($_) $bytes = [system.text.encoding]::convert($encfrom, $encto, $bytes) $encto.getstring($bytes) } } if ($QueryName -eq '') { $csvs = Get-Cluster | Get-ClusterSharedVolume write-host "{" write-host " `"data`":[" write-host foreach ($csv in $csvs) { if ($csv -ne $csvs[-1]) { $line = " { `"{#CSV_NAME}`":`"" + $CSV.Name + "`" }," | convertto-encoding "cp866" "utf-8" } else { $line = " { `"{#CSV_NAME}`":`"" + $CSV.Name + "`" }" | convertto-encoding "cp866" "utf-8" } write-host $line } write-host write-host " ]" write-host "}" write-host } else { $csv = Get-Cluster | Get-ClusterSharedVolume | Where-Object {$_.Name -Match "$CSV_NAME"} switch ($QueryName) { ('Status') {$Results = $CSV.State} ('Owner') {$Results = $CSV.Node} default {$Results = "Incorrect Command Given"} } $Results = $Results | Out-String $Results = $Results.trim() Write-Host $Results }
При этом результат вывода zabbix-get остается прежним, только количество квадратиков становится равным количеству русских букв.Code:{ "data":[ { "{#CSV_NAME}":"╨Ф╨╕╤Б╨║ ╨║╨╗╨░╤Б╤В╨╡╤А╨░ 2" }, { "{#CSV_NAME}":"╨Ф╨╕╤Б╨║ ╨║╨╗╨░╤Б╤В╨╡╤А╨░ 3" } ] }
Прошу помощи, уже всю голову сломал. Может я что-то где-то упустил.
ПС: сервер, откуда берутся данные, это Hyper-V Server 2012 R2 Rus.Comment
-
Извиняюсь. Несмотря на то, что zabbix-get в консоли zabbix-сервера выводит квадратики, в БД значения попадают правильные, с русскими буквами, и все замечательно мониторится.Comment
Comment