Ответ 1
Найден где-то в Интернете:
Write-Output "Server: $($a)"
Отлично работает в моем коде.
Я хочу собрать все выходные данные из моего script в файле журнала и использовать сценарий write-output instaed для записи-хоста.
Write-Output "Server:" $a
выглядит как
Server:
.
foo
Мне действительно нужно писать, чтобы писать write-output $("sfdghk:" + $a)
, чтобы получить Server:Foo
Спасибо -jt
Найден где-то в Интернете:
Write-Output "Server: $($a)"
Отлично работает в моем коде.
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
Ясно, что это абстракция здесь, но я надеюсь, что это может заставить вас понять.
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
В существующих ответах есть хорошая информация, но позвольте мне сделать прагматичное резюме:
При печати на консоль или перенаправлении в файл 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
и когда выбрать, который, см. этот ответ.