В настоящее время в 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.