Хотя у меня нет 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
Надеюсь, это поможет