Как избежать новой строки в записи-выводе - PullRequest
15 голосов
/ 27 мая 2011

Я хочу собрать все выходные данные из моего скрипта в файле журнала и должен использовать запись-вывод вместо write-host.

Write-Output "Server:" $a выглядит как

Server:<br> foo.

Мне действительно нужно писать, чтобы написать
write-output $("sfdghk:" + $a) чтобы получить Server:Foo

Спасибо -jt

Ответы [ 4 ]

15 голосов
/ 31 августа 2012

Нашел где-то в интернете:

Write-Output "Server: $($a)"

Отлично работает в моем коде.

6 голосов
/ 31 августа 2012
Write-Output "Server: $a"
Write-Output ("Server: {0}" -f $a)
Write-Output ("Server: " + $a)

Если вы хотите собрать выходные данные из сценария в файл журнала, рассмотрите возможность использования Start-Transcript.Он регистрирует каждую команду и весь вывод PowerShell в файл.Однако он не регистрирует что-либо, отправленное на стандартный вывод, поэтому, если вы используете какие-либо устаревшие команды, вам придется передать их вывод в Write-Host:

Start-Transcript C:\logs\mylog.txt
Write-Host "Server: " $a
ping | Write-Host
6 голосов
/ 27 мая 2011

9 часов ... Я начинаю ответ.

В Powershell все, чем вы манипулируете, является объектом.

поэтому «Server:» - это объект, $ a - это объект

PS> "server :".gettype()

IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
True     True     String                                   System.Object

Write-output - это CmdLet, который помещает объект в своего рода список (канал), который будет использоватьсядругими CmdLets или скриптами.Так что на самом деле нет новой строки между «Server:» и «foo».Это способ, которым консоль показывает вам список (массив) объектов.Как вы можете видеть здесь под:

PS> $a = "foo"
PS> (Write-Output "Server :" $a).gettype()

IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
True     True     Object[]                                 System.Array

Ясно, что здесь это резюме, но я надеюсь, что оно поможет вам понять.

3 голосов
/ 22 января 2018

В существующих ответах есть хорошая информация, но позвольте мне попробовать прагматическое резюме:

  • При печати на консоли или с перенаправлением в файл, Write-Output разделяет несколько аргументов новой строкой каждый .

  • Следовательно, для получения однострочный вывод, вы должны "предварительно собрать" части для вывода в одну строку , которую вы передаете в качестве одного аргумента.

  • За исключением подавления перечисления коллекций, вам обычно не нужно явно использовать Write-Output , потому что PowerShell по умолчанию отправляет все, что не записано в переменной, не перенаправлено в другое место или не передано по конвейеру в [success]выходной поток (в который Write-Output также пишет);таким образом, в данном случае достаточно следующего:

"Server: $a"  # what this expandable string expands to is *implicitly* output

Что может сбить с толку, так это то, что командлет Write-Host действует по-другому , но важно отметить, что он имеет различное назначение .

# IMPORTANT: Do not use Write-Host to output *data*; only use it to write
#            directly to the host (console).
> Write-Host "Server:"     $a    # multiple spaces used on purpose
Server: srv1

Write-Host, в отличие от Write-Output, разделяет несколько аргументов на один пробел каждый.
Существуют и другие важные отличия, которые обобщены в моего ответа моего.


Учитывая общее название вопроса, давайтетакже адрес как подавить трейлинг символ новой строки :

  • Для печати только на консоли , вы можете использовать Write-Host -NoNewline.

  • С данными выводом , будь то через Write-Output, неявным выводом или из другогокоманда:

    • Вы не можете предотвратить завершающий перевод строки при отправке вывода на консоль .

    • К сожалению,в Windows PowerShell v5.1 / PowerShell Core v6.0.0 вы не можете предотвратить конечный перевод строки при отправке текста во внешние программы через конвейер - см. этот выпуск GitHub .

    • Однако в PSv5 + вы можете предотвратить завершающий перевод новой строки когда записывает вывод в файл , используя Out-File -NoNewline или Set-Content -NoNewline (в PSv4-, вы должны использовать .NET Framework напрямую);напротив, при перенаправлении в файл с > добавляется завершающий символ новой строки.

      • Предупреждение: если вы выводите несколько объектов, -NoNewline не только подавляет завершающий перевод строки, но также переводы строки между этими объектами.
      • О различиях между Out-File и Set-Content и о том, когда выбирать, смотрите этот ответ моего.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...