Ad Widget

Collapse

Экранирование символов обратной косой черты в LLD

Collapse
X
 
  • Time
  • Show
Clear All
new posts
  • Victor Sklyarov
    Senior Member
    • Apr 2016
    • 184

    #1

    Экранирование символов обратной косой черты в LLD

    Не могу понять как правильно экранировать символ обратной косой черты в пути к директории.
    Необходимо менять путь в зависимости от OS
    Обнаружение wmi.get["root\cimv2","select version from Win32_OperatingSystem"]
    Предобработка на JS
    if (!value) {return('[]');}
    var ver = value.split('.');
    if (ver[0]!=5) {
    return('[{"{#RPT_PATH}":"ProgramData"}]');
    } else {
    return('[{"{#RPT_PATH}":"Documents and Settings\\All Users\\Application Data"}]');
    }
    Прототип элемента данных
    system.run["echo off & FOR /F "usebackq tokens=3,4" %a IN (`dir "C:\{#RPT_PATH}\Kaspersky Lab" /-C /S /A:H 2^>nul ^| FINDSTR /I ".rpt"`) do echo %b:%a"]

    Как положено заэкранироавал символ обратной косой черты им же.
    При выполнении обнаружения получаю ошибку
    Invalid discovery rule value: cannot parse as a valid JSON object: invalid escape sequence in string data at: '\All Users\Application Data"}]'

    Zabbix север 6.0.41

  • Victor Sklyarov
    Senior Member
    • Apr 2016
    • 184

    #2
    Попытался заэкранировать "
    return '[{\"{#RPT_PATH}\":\"Documents and Settings\\All Users\\Application Data\"}]';
    Ничего не изменилось. Тест выдаёт нормальный ответ
    [{"{#RPT_PATH}":"Documents and Settings\All Users\Application Data"}]
    Однако ошибка та же
    Invalid discovery rule value: cannot parse as a valid JSON object: invalid escape sequence in string data at: '\All Users\Application Data"}]'
    Last edited by Victor Sklyarov; 15-09-2025, 15:36.

    Comment

    • Kos
      Senior Member
      Zabbix Certified SpecialistZabbix Certified Professional
      • Aug 2015
      • 3404

      #3
      Чтобы в JavaScript'е изобразить обратную косую черту, её надо экранировать ею же. Т.е. ваше выражение:
      Code:
      '[{"{#RPT_PATH}":"Documents and Settings\\All Users\\Application Data"}]'
      даст на выходе текстовую строку, где обратная косая черта встречается дважды по одному разу:
      Code:
      [{"{#RPT_PATH}":"Documents and Settings\All Users\Application Data"}]
      Но эта текстовая строка не является корректным JSON'ом, т.к. в JSON'е применяется аналогичный синтаксис, и для обозначения самой обратной косой черты она должна быть тоже заэкранирована:
      Code:
      [{"{#RPT_PATH}":"Documents and Settings\\All Users\\Application Data"}]
      Решение: либо в вашем коде изображать эту строку, экранируя её дважды:
      Code:
      return('[{"{#RPT_PATH}":"Documents and Settings\\\\All Users\\\\Application Data"}]');
      ​либо использовать конструкцию, преобразующую объект JavaScript в корректную строку JSON:
      Code:
      return(JSON.stringify([{"{#RPT_PATH}":"Documents and Settings\\All Users\\Application Data"}]));
      ​​​Обратите внимание на отсутствие апострофов в параметрах функции JSON.stringify: ей передаётся не строка, а JavaScript-объект (в данном случае - массив из одного элемента), при преобразовании этого объекта в текстовую строку JSON эта функция сама должна позаботиться о необходимом дополнительном экранировании.

      (Добавлено)
      Тест выдаёт нормальный ответ
      Code:
      [{"{#RPT_PATH}":"Documents and Settings\All Users\Application Data"}]​
      Всё верно, это результат работы вашего JavaScript'а, но это (см. выше) не является корректным JSON'ом.
      Должно быть:
      Code:
      [{"{#RPT_PATH}":"Documents and Settings\\All Users\\Application Data"}]​
      Last edited by Kos; 15-09-2025, 15:58.

      Comment

      • Victor Sklyarov
        Senior Member
        • Apr 2016
        • 184

        #4
        Благодарю. Заработало. JSON.stringify применял десятки раз, а тут что-то заклинило.

        Comment

        Working...