Разрывы строк Powershell Write-Host в разных скриптах

У меня есть 2 разных сценария с разрывами строк. Один из них не будет переводить строки без "`n" в конце каждой строки. Посмотрите этот пример с "`n" и без него.

Но другие скрипты работают без тега "`n".

write-host "
This is a test message

This is 2 lines down.
"

Выход:

This is a test message

This is two lines down.

Что отличает их там, где им нужен или не нужен "`n". Они оба .ps1 расширения. И, как видите, они находятся в начале скрипта. Почему в некоторых скриптах разрывы строк отображаются с помощью «n», а другим это не нужно?

В первом случае у вас есть двойные кавычки внутри двойных кавычек. Таким образом, в «`n» следующий обратный апостроф интерпретируется как продолжение строки вместо элемента управления n.

jdweng 05.08.2024 19:21

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

JukEboX 05.08.2024 19:34

В многострочных строках обычно всегда учитываются буквальные символы новой строки, как в вашем втором скрипте. Я не могу воспроизвести ваш симптом, и я также озадачен тем, что перед выводом каждого вызова Write-Host в вашем первом скрипте не печатается начальная новая строка. Содержит ли ваш первый сценарий скрытые управляющие символы или он необычен в каком-то другом отношении? Кроме того, вы, похоже, используете ISE, поэтому позвольте мне предложить стандартный совет в следующем комментарии:

mklement0 05.08.2024 19:57

@mklement0, так что это похоже на проблему с версией Powershell, возможно, на Win10/Win11.

JukEboX 05.08.2024 20:39

Я не думаю, что это проблема самого PowerShell. Я подозреваю, что это конкретное содержимое ваших первых .ps1 файлов, но, не имея возможности проверить его, я не могу сказать наверняка. Вставка содержимого сюда может не сохранить все символы. Вы можете проверить его самостоятельно с помощью Format-Hex или с помощью функции Debug-String, доступной как лицензированный MIT Gist , как показано в нижней части этого ответа.

mklement0 05.08.2024 20:48

Возможно, ваш редактор переносит строку, но разрыва строки там нет.

js2010 05.08.2024 21:11

В вашем первом примере «не нужны» кавычки или экранированные символы новой строки в строках 2 и 3. Так уж получилось, что объединение нескольких строк синтаксически допустимо для Write-Host.

MisterSmith 05.08.2024 21:32

Строка 3 находится вне двойных кавычек и имеет другой цвет. Ты нажимаешь кнопку воспроизведения в ISE?

js2010 05.08.2024 21:35

Это весь сценарий? Внизу не хватает как минимум еще одного write-host 'press enter to being'. PowerShell 5.1?

js2010 05.08.2024 22:04
write-host hi `, а затем в строке 2 there будет одна строка вывода, обратная кавычка будет символом продолжения строки.
js2010 05.08.2024 22:09

Выхожу из того, что @mklement0 сказал о невозможности использовать PWSH7 в IDE. Это можно сделать. См. здесь https://blog.ironmansoftware.com/using-powershell-7-in-the-w‌​indows-powershell-is‌​e/ Я протестировал это, и оно работает, но есть некоторые странности. Например, выходные заголовки перепутались. Visual Studio Code — это то, что вам нужно. Легко переключаться между 5 и 7. Вам просто нужно установить все модули для каждой среды отдельно. Некоторые из них будут работать между обоими, но мне нравится держать это в чистоте.

Matt Williamson 05.08.2024 23:17

@MattWilliamson: Связанное сообщение в блоге интересно как академическое упражнение, но не подходит для реального использования, не в последнюю очередь из-за ограничений самого ISE (различная кодировка символов, отсутствие поддержки интерактивных консольных приложений, вывод stderr в виде ошибок PowerShell). , ...), а именно потому, что использование пространства выполнения вне процесса предполагает сериализацию/десериализацию, которая не только медленная, но и приводит к потере точности типов. Действительно, Visual Studio Code — это путь вперед.

mklement0 06.08.2024 00:31

Второй скрипт представляет собой одну строку (символы в двойных кавычках), а возвращаемые значения являются частью строки в конце каждой строки. В первом скрипте вы объединяете несколько строк, и `n не находится внутри какой-либо пары двойных кавычек. Таким образом, обратный тик интерпретируется как продолжение строки, а не как возврат.

jdweng 06.08.2024 01:27

@jdweng: Обратный апостроф действует как символ продолжения строки только в том случае, если он является самым последним символом в строке, поэтому ваше объяснение неверно.

mklement0 06.08.2024 01:33

@mklement0: Ты уверен. Результаты показывают, что возврат игнорируется. Почему возврат игнорируется? Я думаю, что я прав, а ты нет. Или системе нужны и возврат, и перевод строки: rn

jdweng 06.08.2024 01:39

Я делаю подобное предположение, хотя мы не можем этого сказать на примере.

js2010 06.08.2024 01:41

@jdweng: Да, я уверен в отношении сделанного мною утверждения (если бы то, что вы утверждаете, было правдой, то на следующей строке был бы напечатан буквальный n). И вам легко убедиться в этом факте. Это более продуктивно, чем участие в бесплодных дебатах о том, кто прав, а кто виноват. На данный момент нет объяснения симптому ОП; мой предыдущий комментарий об изучении точного содержимого файла сценария может помочь разгадать тайну.

mklement0 06.08.2024 01:44

@mklement0 mklement0 Итак, вы правы, 'n создает новые строки. Но это все еще не объясняет, почему нижнее изображение работает без `n

JukEboX 07.08.2024 15:33

@JukEboX, все наоборот: нижнее изображение — ожидаемое поведение. У меня нет объяснения верхнему изображению. Как уже отмечалось, я предлагаю проверить файл сценария на наличие скрытых управляющих символов.

mklement0 07.08.2024 18:26

Эй, мы не публикуем здесь изображения кода или вывода.

Joel Coehoorn 09.08.2024 15:38
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
21
91
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Рассмотрим следующие две строки кода:

Write-Host "im`na`nmultiline`nstring"

и

Write-Host "im
a
multiline
string"

Оба они производят один и тот же результат:

im
a
multiline
string

Первый — использование escape-последовательности `n, встроенной в одну строку. Второй — это строка, которая уже содержит буквальные символы новой строки.


Для полноты того же можно добиться с помощью синтаксиса типа here string(/heredoc):

Write-Host @"
I'm
a
heredoc
multiline
string
"@

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

JukEboX 05.08.2024 19:34

Строка состоит из 0 или более символов между парами " двойных кавычек " — в вашем первом примере я насчитал 6 двойных кавычек, поэтому вы не имеете дело с одной строкой. Синтаксис Powershell очень упрощен, поэтому это не рассматривается как ошибка, вполне допустимо объединить несколько строк вместе — вот в чем разница. Еще один синтаксис, который может быть полезно знать, — это строка — devblogs.microsoft.com/scripting/…

MisterSmith 05.08.2024 19:55

+1 за общую информацию (симптомы ОП - загадка); несколько придирок: именно формат новой строки включающего файла определяет формат новой строки многострочных строковых литералов, поэтому это может быть `n или `r`n. Синтаксис PowerShell смягчен только в режиме аргументов , и даже там конкатенация строк не всегда работает так, как вы ожидаете; например "foo"`n"bar" при передаче команде представляет собой два аргумента: "foo" и `n"bar", факт, скрытый Write-Host.

mklement0 05.08.2024 21:02

@MisterSmith Я попробовал метод splat, но он не работает. Это делает весь текст в одной строке неподвижным.

JukEboX 07.08.2024 15:34
Ответ принят как подходящий

Итак, поработав с некоторыми друзьями, мы обнаружили, что проблема, по-видимому, заключается в том, как ISE читает файл при его создании. Если вы создаете новый файл .ps1 в ISE, он не замечает элементы сценария, такие как Write-Host, или функционирует как полный функциональный блок. Это будет обозначаться символом свертывания (+/-) рядом с этой строкой кода. Это означает, что вам нужно добавить код `n в конец каждого разрыва строки Write-Host, чтобы его можно было идентифицировать.

Пример: это файл .ps1, запущенный и созданный в ISE:

Теперь самый простой способ исправить это — взять код и начать его заново в файле Блокнота. Скопируйте свой код в новый файл в Блокноте, а затем сохраните его как .ps1. Когда вы это сделаете, разрывы строк Write-Host не будут требовать `n, поскольку ISE правильно читает их.

Пример: это файл .ps1, созданный и созданный в Блокноте:

Я не уверен, почему возникает ошибка при чтении ISE файлов .ps1 при создании в ISE и чтении разрывов строк с помощью Write-Host. Возможно, это связано с прекращением поддержки. Предлагаю перейти на код VS с помощью Powershell и использовать его. Очень странная проблема, но я рад, что теперь понял.

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

js2010 09.08.2024 15:37

Я также не могу это воспроизвести: значок свертывания оператора появляется сразу, когда я печатаю или вставляю оператор Write-Host с многострочной строкой в ​​новый документ в ISE, а запуск скрипта (даже до его сохранения) ведет себя так, как ожидалось. Это в Windows 11 с версией файла ISE 10.0.22621.1

mklement0 09.08.2024 18:16

Единственный способ воспроизвести это — использовать обратные кавычки. Вывод заканчивается в одной строке.

write-host `
hi `
there

Выход:

hi there

Другие вопросы по теме