Подтвердить что ты не робот

Избегайте новой строки в эхом

В настоящее время в PowerShell команда echo всегда добавляет новую строку. Что было бы эквивалентно Unix echo -n?

4b9b3361

Ответ 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.