Преобразовать в новую строку

1

Я использую powershell, и имею что-то вроде

$testResult = vstest.console $myPathToUnitTests.dll

Результат получается через fine, но есть новые строки (новые строки, как в \n).

Я хочу использовать это в своем HTML файле и сохранить результат как есть в файле javascript.

$testResult = vstest.console $myPathToUnitTests.dll
$js = "const result = $($testResult);"
$js | Set-Content $myPathToJsFile

Это прекрасно работает, и я могу его использовать.

Проблема в том, что он не показывает новые строки. В файле javascript я попытался

result = result.replace(/(?:\r\n|\r|\n)/g, '<br />');

В рамках powershell я попробовал

 $testResult = $testResult.replace("\n", "<br />")

Однако, если я поставлю точку останова на testResult в идентификаторе powershell и наведите указатель мыши на переменную testResult, я вижу

Изображение 174551

Это означает, что он знает, что есть новые линии/разрывы строк. Я просто не могу их удержать :(

  • 1
    $testResult = $testResult -replace '\r?\n','<br />'
  • 0
    Я уверен, что $testResult - это не строка, а массив строк. Это означает, что вам, вероятно, нужно сделать: $TestResult = $TestResult -Join "<br />"
Показать ещё 4 комментария
Теги:
powershell

1 ответ

2
Лучший ответ

vstest.console $myPathToUnitTests.dll возвращает массив, а не строку, поэтому вам нужно будет присоединить все строки (строки) вместе с оператором -join, например, для html:

$TestResult -Join "<br />"

Или если вы хотите создать многострочный текстовый файл:

$TestResult -Join [System.Environment]::NewLine

Примечание. Для этого я рекомендую использовать определение новой строки по умолчанию ([System.Environment]::NewLine), а не жестко закодированные строки новой строки (например: 'r'n).

Как вы могли это знать?

Вы не можете легко предсказать, что неизвестный командлет или команда вернется, но тот факт, что PowerShell очень хорошо справляется с несколькими объектами (массивами) в конвейере сразу, является причиной того, что каждый неизвестный командлет или команда может потенциально возвращать несколько объекты (или строки), собранные в массиве при назначении переменной. Излишне говорить, что уже есть десятки подобных вопросов PowerShell StackOverflow, подобных этой, которая имеет ту же причину. Тем не менее, связанные вопросы сами по себе слишком сильно отличаются, чтобы обозначить их как дубликаты. В этих других вопросах собственная команда PowerShell Get-Content, вероятно, чаще всего является причиной этой ловушки программирования PowerShell.

Лучший способ узнать, что в настоящее время возвращается неизвестным командлетом, - показать его тип с помощью GetType() (который не работает над $Null) или с использованием свойства PSTypeNames (который обычно возвращает массив унаследованных типов ):

PS C:\> (get-content .\SingleLine.txt).PSTypeNames
System.String
System.Object

Но это не гарантирует, что он всегда будет возвращать один и тот же (один) тип объекта:

PS C:\> (get-content .\MultipleLines.txt).PSTypeNames
System.Object[]
System.Array
System.Object

Тот факт, что (строковые) массивы обычно отображаются в нескольких строках (разделенных новой строкой) непосредственно на хосте, где они хранятся вместе (разделенные пробелом), когда они инкапсулированы в строку, может быть триггером для распознавания проблемы:

PS C:\> $a = "a", "b", "c"
PS C:\> $a
a
b
c
PS C:\> "$a"
a b c
PS C:\>

Будет ли подобное подобное возвращать массив?

Неопределенность, что командлет или команда может вернуть объект (строка) или массив объектов (строк), вызывает новый вопрос (как вы прокомментировали).
Эта неопределенность на самом деле легко разрешима в PowerShell; просто заключите вывод в массив (в скобках с именем @в начале, см. также: Как заставить ForceShell возвращать массив, когда вызов возвращает только один объект?):

  • Если выход не был уже массивом, он станет массивом с одним объектом (строкой)
  • Если выход был уже массивом, он останется точно таким же массивом.

В более позднем условии важно понять, что никакие дополнительные уровни не добавляются к результирующему массиву

Эта техника обычно используется в PowerShell:

$a = "a", "b", "c"
@($a)[0] # still returns: "a"
@(@(@($a)))[0] # or even this returns: "a"
  • 0
    Какой удивительный ответ

Ещё вопросы

Сообщество Overcoder
Наверх
Меню