Идентичная функция возвращает разные значения в зависимости от того, создан ли он в консоли или из модуля - PullRequest
1 голос
/ 14 июня 2019

У меня есть функция в модуле PowerShell, которая возвращает другое значение, чем если бы я определил эту функцию в консоли, а затем запустил ее.

Я пытаюсь заменить запятую в переменной JSON (в противном случае JSON недопустим). При объявлении из консоли эта функция работает безупречно. Но однажды внутри моего модуля, и импортируется, это не так.

Вот функция:

Function Format-Something {
     $myJSON =
'{
     "command": "test",
     "something": "else",
}'
     $myJSON.Replace(",`n}","`n}")
}

Вот пример, показывающий точно такой же код в моем редакторе и в окне powershell.

Screenshot imgur link

Я изначально загружаю модуль и запускаю функцию. не работает как задумано. Затем я копирую и вставляю тот же код функции в консоль, и он работает правильно.

Полагаю, это как-то связано с форматированием новой строки. Но я попытался основать свою замену на `r`n и `n, но безрезультатно.

Ответы [ 2 ]

0 голосов
/ 14 июня 2019

Работает ли это:

Function Format-Something {
    $myJSON =
'{
    "command": "test",
    "something": "else",
}'
    $myJSON.Replace(",$([Environment]::NewLine)}","$([Environment]::NewLine)}")
}

И немного более надежный:

[RegEx]::Replace($myJSON, "\s*,\s*$([Environment]::NewLine)\s*}", "$([Environment]::NewLine)}", [System.Text.RegularExpressions.RegexOptions]::Multiline)
0 голосов
/ 14 июня 2019

Мой инстинкт говорит мне, что когда он сохраняется в модуле, в сохраненном файле есть перевод каретки и перевод строки.Таким образом, ваша строка соответствия не проверяется на соответствие одному и тому же тексту.

Переключение на замену регулярных выражений может сделать это, по-видимому, бесполезным.",`r?`n\}" должно работать, так как возврат каретки является необязательным (как обозначено ?).Однако вы на самом деле говорите, что любая запятая, за которой следует пробел и закрывающая скобка, должна удалить запятую, поэтому давайте просто сделаем это.

'{
     "command": "test",
     "something": "else",
}' -replace ",\s+}", "`r`n}"

Таким образом, мы заменяем любую запятую, затем пробел.Вы могли бы взять это дальше с предвкушением, но я хотел сделать это простым.

Примечание: это может вызвать косметическую проблему, если вы вложили json, а также не найти некоторые проблемы, если вы не следуете правилам форматирования.например,

{
     "command": "test",
     "nested": [{"Test":1234},]
     "something": "else",}

Это просто помогает понять, почему то, что вы делали, действовало так, как оно было (если я, конечно, прав).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...