Избегайте новой строки в эхом
В настоящее время в 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.