积极答复者
Создание JSON файл

问题
-
Я понимаю, что тема немного не сюда, но может подскажите.
Задача мониторить размер подпапок по определенному пути. Скрипт на powershell формирует файл в json, а zabbix его считывает.
Создать файл не проблема, файл создает, но когда заббикс пытается его прочитать, ошибка
Invalid discovery rule value: cannot parse as a valid JSON object: invalid object format, expected opening character '{' or '[' at: ' ■{Скрипт
Files_Array = @() $MainFolder = "\\?\E:\Distr\Microsoft\" ; $Files_Array ='{' $Files_Array +=[System.Environment]::NewLine + ' "data": ['
$SubFolders = Get-ChildItem -LiteralPath $MainFolder | where {$_.PSIsContainer -eq $true} | Sort-Object; foreach ($folder in $subfolders) { $SubFolderSize = Get-ChildItem $folder.FullName -Recurse | measure -Property length -Sum; $size=$SubFolderSize.Sum $size = "{0:N0}" -f ($SubFolderSize.Sum/1GB) $Files_Array +=[System.Environment]::NewLine +'{"{#FOLNAME}": "'+ $folder + '", "{#FOLSIZE}": "' +$size+ '"},' } $Files_Array +=[System.Environment]::NewLine +' ] }' $Files_Array | out-file C:\zabbix\scripts\folders\disk.txt
файл с результатом
{ "data": [ {"{#FOLNAME}": "Business Studio", "{#FOLSIZE}": "5"}, {"{#FOLNAME}": "ConfigurationManager", "{#FOLSIZE}": "3"} ] }
Я делал по аналогии с другим скриптом (писал не я), он из 1С выгружает списки баз, пользователей... там файл формируется через vbs, я его переделал, чтобы размеры папок считал и даже работает, но с ним другая проблема, если к примеру нету доступа в папку, то он сразу прерывает выполнение. Может можно как-то пропускать ? Так же могут быть с длинными путями, ошибку наверное тоже будет выдавать ?
Вот скрипт
BaseDirectory = "g:\Users\" Const strBasesListFileName = "c:\zabbix\scripts\folders\disk_n.txt" CheckFolder(BaseDirectory) Dim strBasesList ' Список баз Dim BC Dim sfn Dim BN Sub WriteToFile (ByVal strFileName, ByVal strString) ' Опишем константы для работы с текстовыми файлами Const ForReading = 1 Const ForWriting = 2 Const ForAppending = 8 Dim fso, f Err.Clear On Error Resume Next Set fso = CreateObject("Scripting.FileSystemObject") Set f = fso.OpenTextFile(strFileName, ForWriting, True) f.WriteLine strString f.Close Set f = Nothing Set fso = Nothing End Sub Function CheckFolder(Directory) Set sss = CreateObject("WScript.Shell") Set fso = CreateObject("Scripting.FileSystemObject") Set f = fso.GetFolder(Directory) strBasesList = "{" strBasesList = strBasesList & vbCrLf & " ""data"": [" BN = 0 BC = 1 For Each sfn In f.subfolders BN = BN +1 Next For each sf In f.subfolders 'value = round(sf.Size/1048576/1024) WScript.Echo sf value = sf.Size If BN = BC Then strBasesList = strBasesList & vbCrLf & " {""{#FOLNAME}"": """ & sf.name & """, ""{#FOLSIZE}"": """ & Value & """}" Else strBasesList = strBasesList & vbCrLf & " {""{#FOLNAME}"": """ & sf.name & """, ""{#FOLSIZE}"": """ & Value & """}," End If BC = BC +1 'WScript.Echo strBasesList Next strBasesList = strBasesList & vbCrLf & " ]" strBasesList = strBasesList & vbCrLf & "}" End Function WScript.Echo strBasesList
答案
全部回复
-
Пример файла который вы привели является правильным JSON. Вы можете это проверить используя любой онлайновый форматер/валидатор. Либо вы используйте не этот конкретный файл, а какой то другой, либо же программа ругается на схему файла. Например, то что в кавычках вроде "#{...}" неверно.
This posting is provided "AS IS" with no warranties, and confers no rights.
-
-
Квадраты обычно означают что в шрифте нет этого символа. Знак вопрос означает что в кодировке нет этого символа.
VBS имеет оператор On Error. Наверное его можно использовать для пропуска при возникновении ошибки.
This posting is provided "AS IS" with no warranties, and confers no rights.
-
Предполагаю, что проблема в кодировке.
Out-File
, если я правильно помню, использует UTF-16 с BOM. А в какой кодировке zabbix ожидает JSON файл?Скорее всего по умолчанию используется UTF-8. В любом случае это можно поменять параметром Encoding.
Что до "zabbix", я с ним не знаком. Если у вас есть рабочий файл, то посмотрите в какой он кодировке и используйте такую же. Можно так же попробовать несколько разных или спросить в форумах "zabbix".
This posting is provided "AS IS" with no warranties, and confers no rights.
-
UTF-8 не отличается от 866 если нет национальных символов. В вашем примере их нет.
Может быть действительно BOM мешает, но не ясно почему не сработала перекодировка. BOM будет виден в любом 16-ричном редакторе, первый байт будет EF или FF в зависимости от кодировки.
В любом случае не помешает сравнить рабочий/не рабочий файл по байтам.
This posting is provided "AS IS" with no warranties, and confers no rights.
-
В общем нашел нужную кодировку, это UTF-8. Но UTF-8 с BOM не проходит, выдает другой ошибочный символ. out-file -Enc UTF8 выводит с BOM, а как сделать без BOM ? Кстати у меня будут имена папок с кириллицей.
Думаю это поможет:
-
utf8NoBOM
: Encodes in UTF-8 format without Byte Order Mark (BOM)
https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.utility/out-file?view=powershell-7.2
This posting is provided "AS IS" with no warranties, and confers no rights.
-
-
А нету у меня такого параметра
Out-File : Не удается проверить аргумент для параметра "Encoding". Аргумент "utf8NoBOM" не принадлежит набору "unknown;string;unicode;bigendianunicode;utf8;utf7;utf32;ascii;default;oem", заданному ат
рибутом ValidateSet. Укажите аргумент, который принадлежит данному набору, после чего повторите выполнение команды. -
А нету у меня такого параметра
Out-File : Не удается проверить аргумент для параметра "Encoding". Аргумент "utf8NoBOM" не принадлежит набору "unknown;string;unicode;bigendianunicode;utf8;utf7;utf32;ascii;default;oem", заданному ат
рибутом ValidateSet. Укажите аргумент, который принадлежит данному набору, после чего повторите выполнение команды.Ну тогда видимо остается придумать "обрезатель" трех первых байтов файла или сдаться и делать все руками. :)
Ну или как вариант можете исправить заббикс научив его нормально работать с общепринятыми кодировками, это ведь вроде открытый исходник?
This posting is provided "AS IS" with no warranties, and confers no rights.