none
Создание JSON файл RRS feed

  • السؤال

  • Я понимаю, что тема немного не сюда, но может подскажите.

    Задача мониторить размер подпапок по определенному пути. Скрипт на 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

    21/رمضان/1443 09:25 ص

الإجابات

  • Решил по другому

    out-file  -Enc utf8

    А в заббиксе, в запросе убрал кодировку, оставил по умолчанию и все отлично работает. Спасибо

    • تم وضع علامة كإجابة بواسطة RK3DNP 27/رمضان/1443 10:43 ص
    27/رمضان/1443 10:43 ص

جميع الردود

  • Пример файла который вы привели является правильным JSON. Вы можете это проверить используя любой онлайновый форматер/валидатор. Либо вы используйте не этот конкретный файл, а какой то другой, либо же программа ругается на схему файла. Например, то что в кавычках вроде "#{...}" неверно.


    This posting is provided "AS IS" with no warranties, and confers no rights.

    21/رمضان/1443 04:49 م
    المشرف
  •  Да, файл я тоже проверял, все верно. Меня вот смущает символ квадрата в ошибке  '{' or '[' at: ' ■{  откуда он его берет. Возможно это могло бы решить мою проблему. 

    Либо может кто подскажет, как на VBS можно пропускать папки куда нет доступа, не прекращая выполнять скрипт ?

    21/رمضان/1443 07:06 م
  • Квадраты обычно означают что в шрифте нет этого символа. Знак вопрос означает что в кодировке нет этого символа.

    VBS имеет оператор On Error. Наверное его можно использовать для пропуска при возникновении ошибки.


    This posting is provided "AS IS" with no warranties, and confers no rights.

    21/رمضان/1443 08:28 م
    المشرف
  • Предполагаю, что проблема в кодировке. Out-File, если я правильно помню, использует UTF-16 с BOM. А в какой кодировке zabbix ожидает JSON файл?
    21/رمضان/1443 09:05 م
  • Предполагаю, что проблема в кодировке. 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.

    21/رمضان/1443 09:15 م
    المشرف
  • В рабочей версии файл создается в кодировке cp886, в заббиксе указана тоже CP886. Я пробовал файл через notepad++ менять кодировку на cp866, проблема не уходила. А как сразу в эту кодировку сделать файл, не нашел. 

    про On Error почитаю

    22/رمضان/1443 06:28 ص
  • UTF-8 не отличается от 866 если нет национальных символов. В вашем примере их нет.

    Может быть действительно BOM мешает, но не ясно почему не сработала перекодировка. BOM будет виден в любом 16-ричном редакторе, первый байт будет EF или FF в зависимости от кодировки. 

    В любом случае не помешает сравнить рабочий/не рабочий файл по байтам.


    This posting is provided "AS IS" with no warranties, and confers no rights.

    22/رمضان/1443 04:43 م
    المشرف
  • В общем нашел нужную кодировку, это UTF-8. Но UTF-8 с BOM не проходит, выдает другой ошибочный символ. out-file  -Enc UTF8 выводит с BOM, а как сделать без BOM ? Кстати у меня будут имена папок с кириллицей.
    23/رمضان/1443 07:02 ص
  • В общем нашел нужную кодировку, это 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.

    23/رمضان/1443 04:16 م
    المشرف
  • А нету у меня такого параметра

    Out-File : Не удается проверить аргумент для параметра "Encoding". Аргумент "utf8NoBOM" не принадлежит набору "unknown;string;unicode;bigendianunicode;utf8;utf7;utf32;ascii;default;oem", заданному ат
    рибутом ValidateSet. Укажите аргумент, который принадлежит данному набору, после чего повторите выполнение команды.

    27/رمضان/1443 05:59 ص
  • А нету у меня такого параметра

    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.

    27/رمضان/1443 06:23 ص
    المشرف
  • Решил по другому

    out-file  -Enc utf8

    А в заббиксе, в запросе убрал кодировку, оставил по умолчанию и все отлично работает. Спасибо

    • تم وضع علامة كإجابة بواسطة RK3DNP 27/رمضان/1443 10:43 ص
    27/رمضان/1443 10:43 ص