Избегайте новой строки в эхо - PullRequest
32 голосов
/ 14 февраля 2012

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

Ответы [ 4 ]

37 голосов
/ 14 февраля 2012

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 следующему объекту в конвейере.

5 голосов
/ 14 февраля 2012

Вы можете использовать Write-Host:

Write-Host "Hello " -nonewline
Write-Host "There!"

Или из командной строки:

PS C:\> Write-Host "Hello " -nonewline ; Write-Host "There!"
Hello There!
3 голосов
/ 28 марта 2017

В дополнение к полезный ответ Энди Арисменди :

  • В Bash echo -n (или его переносимый эквивалент printf %s) отправляет свои аргументы поток данных (выходной), стандартный вывод .

  • PowerShell эквивалентен потоку стандартного вывода Unix - успешный поток , длякоторый выводится из команд по умолчанию .
    Обратите внимание, что PowerShell может отправлять в поток успеха объекты любого типа, а не только текст.

  • Поэтому строгоговоря, например, эквивалент echo -n 'hi' Баша в PowerShell составляет всего 'hi' - строка неявно отправляется в поток успеха.

  • При этом Единственный способ отправить строку без завершающего перевода строки на консоль - это обойти поток успеха, то есть 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 также не помещает символы новой строки между вводами, если их кратно:

    • Set-Content / Add-Content
    • Out-File

Обходной путь для записи вывода из нескольких команд в однострочную строку впоток вывода:

Обходной путь должен просто использовать интерполяцию или конкатенацию строк или формуatting объединить выходные данные всех команд, которые должны образовывать одну строку выходного текста:

Например, (грубый) эквивалент следующего кода Bash ...

#!/bin/bash

echo -n 'Today is: '
date

... в PowerShell:

  • с использованием расширяемой строки (интерполяция строки внутри "..." с использованием оператора подвыражения $(...)):

    "Today is: $(Get-Date)"
    
  • альтернативно, используя конкатенацию строк , с оператором +:

    'Today is: ' + (Get-Date)
    
  • или, используя -f, оператор (строка -) :

    'Today is: {0}' -f (Get-Date)
    

Все эти команды PowerShell отправляют однострочную строку в поток успеха, но учтите, чтоЗатем за этой строкой неизменно следует символ новой строки при печати в консоли .

1 голос
/ 27 марта 2017
Write-Host -n 

у меня работает в PowerShell 5.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...