Избегание новой строки в записи-выходе

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

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

Server:
foo
.

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

Спасибо -jt

Ответ 1

Найден где-то в Интернете:

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

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

Ответ 2

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

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

поэтому "Сервер:" - это объект, $a - это объект

PS> "server :".gettype()

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

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

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

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

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

Ответ 3

Write-Output "Server: $a"
Write-Output ("Server: {0}" -f $a)
Write-Output ("Server: " + $a)

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

Start-Transcript C:\logs\mylog.txt
Write-Host "Server: " $a
ping | Write-Host

Ответ 4

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

  • При печати на консоль или перенаправлении в файл 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 и когда выбрать, который, см. этот ответ.