У меня есть 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», а другим это не нужно?
@jdweng Я понимаю, для чего они нужны. Я пытаюсь выяснить, что некоторым сценариям требуется однострочная строка для разрыва строк, а другим нет.
В многострочных строках обычно всегда учитываются буквальные символы новой строки, как в вашем втором скрипте. Я не могу воспроизвести ваш симптом, и я также озадачен тем, что перед выводом каждого вызова Write-Host в вашем первом скрипте не печатается начальная новая строка. Содержит ли ваш первый сценарий скрытые управляющие символы или он необычен в каком-то другом отношении? Кроме того, вы, похоже, используете ISE, поэтому позвольте мне предложить стандартный совет в следующем комментарии:
В качестве отступления: PowerShell ISE больше не активно разрабатывается и есть причины не использовать его (нижний раздел), в частности, невозможность запуска PowerShell (Core) 7. Активно разрабатываемый кроссплатформенный Редактор, который предлагает лучшие возможности разработки PowerShell, — это Visual Studio Code с его расширением PowerShell.
@mklement0, так что это похоже на проблему с версией Powershell, возможно, на Win10/Win11.
Я не думаю, что это проблема самого PowerShell. Я подозреваю, что это конкретное содержимое ваших первых .ps1 файлов, но, не имея возможности проверить его, я не могу сказать наверняка. Вставка содержимого сюда может не сохранить все символы. Вы можете проверить его самостоятельно с помощью Format-Hex или с помощью функции Debug-String, доступной как лицензированный MIT Gist , как показано в нижней части этого ответа.
Возможно, ваш редактор переносит строку, но разрыва строки там нет.
В вашем первом примере «не нужны» кавычки или экранированные символы новой строки в строках 2 и 3. Так уж получилось, что объединение нескольких строк синтаксически допустимо для Write-Host.
Строка 3 находится вне двойных кавычек и имеет другой цвет. Ты нажимаешь кнопку воспроизведения в ISE?
Это весь сценарий? Внизу не хватает как минимум еще одного write-host 'press enter to being'. PowerShell 5.1?
write-host hi `, а затем в строке 2 there будет одна строка вывода, обратная кавычка будет символом продолжения строки.
Выхожу из того, что @mklement0 сказал о невозможности использовать PWSH7 в IDE. Это можно сделать. См. здесь https://blog.ironmansoftware.com/using-powershell-7-in-the-windows-powershell-ise/ Я протестировал это, и оно работает, но есть некоторые странности. Например, выходные заголовки перепутались. Visual Studio Code — это то, что вам нужно. Легко переключаться между 5 и 7. Вам просто нужно установить все модули для каждой среды отдельно. Некоторые из них будут работать между обоими, но мне нравится держать это в чистоте.
@MattWilliamson: Связанное сообщение в блоге интересно как академическое упражнение, но не подходит для реального использования, не в последнюю очередь из-за ограничений самого ISE (различная кодировка символов, отсутствие поддержки интерактивных консольных приложений, вывод stderr в виде ошибок PowerShell). , ...), а именно потому, что использование пространства выполнения вне процесса предполагает сериализацию/десериализацию, которая не только медленная, но и приводит к потере точности типов. Действительно, Visual Studio Code — это путь вперед.
Второй скрипт представляет собой одну строку (символы в двойных кавычках), а возвращаемые значения являются частью строки в конце каждой строки. В первом скрипте вы объединяете несколько строк, и `n не находится внутри какой-либо пары двойных кавычек. Таким образом, обратный тик интерпретируется как продолжение строки, а не как возврат.
@jdweng: Обратный апостроф действует как символ продолжения строки только в том случае, если он является самым последним символом в строке, поэтому ваше объяснение неверно.
@mklement0: Ты уверен. Результаты показывают, что возврат игнорируется. Почему возврат игнорируется? Я думаю, что я прав, а ты нет. Или системе нужны и возврат, и перевод строки: rn
Я делаю подобное предположение, хотя мы не можем этого сказать на примере.
@jdweng: Да, я уверен в отношении сделанного мною утверждения (если бы то, что вы утверждаете, было правдой, то на следующей строке был бы напечатан буквальный n). И вам легко убедиться в этом факте. Это более продуктивно, чем участие в бесплодных дебатах о том, кто прав, а кто виноват. На данный момент нет объяснения симптому ОП; мой предыдущий комментарий об изучении точного содержимого файла сценария может помочь разгадать тайну.
@mklement0 mklement0 Итак, вы правы, 'n создает новые строки. Но это все еще не объясняет, почему нижнее изображение работает без `n
@JukEboX, все наоборот: нижнее изображение — ожидаемое поведение. У меня нет объяснения верхнему изображению. Как уже отмечалось, я предлагаю проверить файл сценария на наличие скрытых управляющих символов.
Эй, мы не публикуем здесь изображения кода или вывода.





Рассмотрим следующие две строки кода:
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
"@
Я понимаю, для чего они нужны. Я пытаюсь выяснить, что некоторым сценариям требуется однострочная строка для разрыва строк, а другим нет.
Строка состоит из 0 или более символов между парами " двойных кавычек " — в вашем первом примере я насчитал 6 двойных кавычек, поэтому вы не имеете дело с одной строкой. Синтаксис Powershell очень упрощен, поэтому это не рассматривается как ошибка, вполне допустимо объединить несколько строк вместе — вот в чем разница. Еще один синтаксис, который может быть полезно знать, — это строка — devblogs.microsoft.com/scripting/…
+1 за общую информацию (симптомы ОП - загадка); несколько придирок: именно формат новой строки включающего файла определяет формат новой строки многострочных строковых литералов, поэтому это может быть `n или `r`n. Синтаксис PowerShell смягчен только в режиме аргументов , и даже там конкатенация строк не всегда работает так, как вы ожидаете; например "foo"`n"bar" при передаче команде представляет собой два аргумента: "foo" и `n"bar", факт, скрытый Write-Host.
@MisterSmith Я попробовал метод splat, но он не работает. Это делает весь текст в одной строке неподвижным.
Итак, поработав с некоторыми друзьями, мы обнаружили, что проблема, по-видимому, заключается в том, как ISE читает файл при его создании. Если вы создаете новый файл .ps1 в ISE, он не замечает элементы сценария, такие как Write-Host, или функционирует как полный функциональный блок. Это будет обозначаться символом свертывания (+/-) рядом с этой строкой кода. Это означает, что вам нужно добавить код `n в конец каждого разрыва строки Write-Host, чтобы его можно было идентифицировать.
Пример: это файл .ps1, запущенный и созданный в ISE:
Теперь самый простой способ исправить это — взять код и начать его заново в файле Блокнота. Скопируйте свой код в новый файл в Блокноте, а затем сохраните его как .ps1. Когда вы это сделаете, разрывы строк Write-Host не будут требовать `n, поскольку ISE правильно читает их.
Пример: это файл .ps1, созданный и созданный в Блокноте:
Я не уверен, почему возникает ошибка при чтении ISE файлов .ps1 при создании в ISE и чтении разрывов строк с помощью Write-Host. Возможно, это связано с прекращением поддержки. Предлагаю перейти на код VS с помощью Powershell и использовать его. Очень странная проблема, но я рад, что теперь понял.
ISE у меня работает. Я предполагаю, что в конце есть заключительная цитата.
Я также не могу это воспроизвести: значок свертывания оператора появляется сразу, когда я печатаю или вставляю оператор Write-Host с многострочной строкой в новый документ в ISE, а запуск скрипта (даже до его сохранения) ведет себя так, как ожидалось. Это в Windows 11 с версией файла ISE 10.0.22621.1
Единственный способ воспроизвести это — использовать обратные кавычки. Вывод заканчивается в одной строке.
write-host `
hi `
there
Выход:
hi there
В первом случае у вас есть двойные кавычки внутри двойных кавычек. Таким образом, в «`n» следующий обратный апостроф интерпретируется как продолжение строки вместо элемента управления n.