В настоящее время в PowerShell команда echo всегда добавляет новую строку. Что было бы эквивалентно Unix echo -n?
Избегайте новой строки в эхом
Ответ 1
echo является псевдонимом для Write-Output, который отправляет объекты в следующую команду в конвейере. Если все, что вы хотите сделать, это отобразить текст на консоли, которую вы можете сделать:
Write-Host "Hi" -NoNewLine
Имейте в виду, что это не тот же командлет, что и echo | Write-Output.
Write-Output Основная цель - отправить объекты следующей команде в конвейере, где Write-Host основная цель - отобразить текст на консоли. Причина, по которой вы видите текст на консоли с помощью Write-Output, заключается в том, что механизм PowerShell отправляет все в Out-Default в конце конвейера, который отправляет входящий объект PowerShell в механизм форматирования текста.
Вот пример:
Write-Host "hi" | Get-Member
Это приведет к ошибке, потому что Write-Host просто записывает текст в консоль и не перенаправляет строку на следующую команду в конвейере.
Write-Output "hi" | Get-Member
Это отобразит свойства и методы System.String, потому что Write-Output отправляет объект string в следующий объект в конвейере.
Ответ 2
Вы можете использовать Write-Host:
Write-Host "Hello " -nonewline
Write-Host "There!"
Или из командной строки:
PS C:\> Write-Host "Hello " -nonewline ; Write-Host "There!"
Hello There!
Ответ 3
В дополнение к Энди Арисменди полезный ответ:
-
В Bash
echo -n(или его переносимый эквивалент,printf %s) отправляет свои аргументы потоку данных (вывода) stdout. -
PowerShell, эквивалентный потоку стандартного вывода Unix, - это поток успеха, в который по умолчанию выводятся команды.
Обратите внимание, что PowerShell может отправлять в поток успеха объекты любого типа, а не только текст. -
Поэтому, строго говоря, эквивалентом Bash
echo -n 'hi', например, является просто'hi'в PowerShell - строка неявно отправляется в поток успеха. -
Тем не менее, единственный способ отправить строку без завершающего перевода строки в консоль - это обойти поток успеха, что и делает
Write-Host -noNewLine, как обсуждалось в ответе Энди.-
До PowerShell v4 выходные данные
Write-Hostвообще не могли быть записаны, поскольку они просто выводились непосредственно на консоль, минуя потоки вывода PowerShell. -
Начиная с PowerShell v5,
Write-Hostзаписывает во вновь представленный поток для записи структурированной информации номер6и фактически является псевдонимом дляWrite-Information -InformationAction Continue- см.Get-Help Write-Information.
-
-
Когда дело доходит до записи в файлы, PowerShell v5 добавляет поддержку параметра
-noNewlineдля следующих командлетов (до v4, запись/добавление в текстовый файл неизменно добавляет завершающий-noNewLineстроки), но обратите внимание, что-noNewLineтакже не помещает переводы между входами, если их несколько:-
Set-Content/Add-Content -
Out-file
-
Обходной путь для записи вывода из нескольких команд в однострочную строку в потоке вывода:
Обходной путь - просто использовать интерполяцию строк, конкатенацию или форматирование, чтобы объединить выходные данные всех команд, которые должны образовывать одну строку выходного текста:
Например, (грубый) эквивалент следующего кода Bash...
#!/bin/bash
echo -n 'Today is: '
date
... в PowerShell есть:
-
используя расширяемую строку (интерполяция строк внутри
"...", используя оператор подвыражения$(...)):"Today is: $(Get-Date)" -
альтернативно, используя конкатенацию строк с оператором
+:'Today is: ' + (Get-Date) -
или, используя
-f, оператор формата (string-):'Today is: {0}' -f (Get-Date)
Все эти команды PowerShell отправляют однострочную строку в поток успеха, но обратите внимание, что после этой строки за самой строкой всегда следует новая строка, когда она печатается в консоли.
Ответ 4
Write-Host -n
работает для меня в PowerShell 5.