Как объединить строки и переменные в PowerShell?

Предположим, у меня есть следующий фрагмент:

$assoc = New-Object psobject -Property @{
    Id = 42
    Name = "Slim Shady"
    Owner = "Eminem"
}

Write-host $assoc.Id + "  -  "  + $assoc.Name + "  -  " + $assoc.Owner

Я ожидаю, что этот фрагмент отобразит:

42 - Slim Shady - Eminem

Но вместо этого он показывает:

42 + - + Slim Shady + - + Eminem

Что заставляет меня думать, что оператор + не подходит для конкатенации строк и переменных.

Как вы подходите к этому с помощью PowerShell?

Ответ 2

Никто, кажется, не упомянул разницу между одиночными и двойными кавычками. (Я использую PowerShell 4).

Вы можете сделать это (как сказал @Ben):

$name = 'Slim Shady'
Write-Host 'My name is'$name
-> My name is Slim Shady

Или вы можете сделать это:

$name = 'Slim Shady'
Write-Host "My name is $name"
-> My name is Slim Shady

Одиночные кавычки для литерала, вывод строки точно так же, пожалуйста. Двойные кавычки предназначены для того, когда вы хотите выполнить некоторую предварительную обработку (например, переменные, специальные символы и т.д.)

Итак:

$name = "Marshall Bruce Mathers III"
Write-Host "$name"
-> Marshall Bruce Mathers III

В то время как:

$name = "Marshall Bruce Mathers III"
Write-Host '$name'
-> $name

(http://ss64.com/ps/syntax-esc.html Я считаю полезным для справки).

Ответ 3

Один из способов:

Write-host "$($assoc.Id)  -  $($assoc.Name)  -  $($assoc.Owner)"

Другой:

Write-host  ("{0}  -  {1}  -  {2}" -f $assoc.Id,$assoc.Name,$assoc.Owner )

Или просто (но мне это не нравится;)):

Write-host $assoc.Id  "  -  "   $assoc.Name  "  -  "  $assoc.Owner

Ответ 4

Вы также можете использовать -join

Э.Г.

$name = -join("Jo", "h", "n");

Назначил бы "Джона" на $ name.

Итак, вывести в одну строку:

Write-Host (-join("Jo", "h", "n"))

Ответ 5

Попробуйте обернуть все, что вы хотите распечатать в скобках:

Write-host ($assoc.Id + "  -  "  + $assoc.Name + "  -  " + $assoc.Owner)

Ваш код интерпретируется как количество параметров, передаваемых в Write-Host. Объединение его в скобки приведет к объединению значений, а затем передаёт результирующее значение как один параметр.

Ответ 6

Другой вариант:

$string = $assoc.ID
$string += " - "
$string += $assoc.Name
$string += " - "
$string += $assoc.Owner
Write-Host $string

"Лучший" метод, вероятно, является тем, который предложил C.B.

Write-host "$($assoc.Id)  -  $($assoc.Name)  -  $($assoc.Owner)"

Ответ 7

Вам нужно поместить выражение в круглые скобки, чтобы они не обрабатывались как параметры для командлета:

Write-host ($assoc.Id + "  -  "  + $assoc.Name + "  -  " + $assoc.Owner)

Ответ 8

Пока выражение:

"string1" + "string2" + "string3"

будет конкатенация строк. Вам нужно поставить $перед круглой скобкой, чтобы она оценивалась как один аргумент при передаче команде powershell. Пример:

Write-Host $( "string1" + "string2" + "string3" ) 

В качестве бонуса, если вы хотите, чтобы он охватывал несколько строк, вам нужно использовать синтаксис обратной ссылки в конце строки (без пробелов или символов справа от обратного хода). Пример:

Write-Host $(`
    "The rain in "        +`
    "Spain falls mainly " +`
    "in the plains"       )`
    -ForegroundColor Yellow

(На самом деле, я думаю, Powershell в настоящее время реализована немного неправильно, требуя ненужных обратных тиков между скобками. Если Microsoft будет просто следовать правилам Penton или TCL Parenthesis, которые позволят вам разместить столько строк, сколько вы хотите между начальными и конечными скобками, тогда они решат большинство проблем, которые люди не любят в powershell, связанных с продолжением строки и конкатенацией строк. Я обнаружил, что вы можете иногда оставлять обратные метки на продолжении строки между круглыми скобками, но его действительно прозрачный и непредсказуемый, если он будет работать.. его лучше просто добавить backticks.)

Ответ 9

Вот альтернативный вариант:

Write-host (" {0}  -  {1}  -  {2}" -f $assoc.Id, $assoc.Name, $assoc.Owner)

Ответ 10

Я просто хочу использовать другой способ, используя .NET String.Format:

$name = "Slim Shady"
Write-Host ([string]::Format("My name is {0}", $name))

Ответ 12

Эти ответы кажутся очень сложными. Если вы используете это в PowerShell script, вы можете просто сделать это:

$name = 'Slim Shady'
Write-Host 'My name is'$name

Он выведет

Меня зовут Slim Shady

Обратите внимание, как между вашими словами вы помещаете пробел

Ответ 13

Объединить строки так же, как в дни DOS. Это очень важно для ведения журнала, так что вы идете:

$strDate = Get-Date
$strday = "$($strDate.Year)$($strDate.Month)$($strDate.Day)"

Write-Output "$($strDate.Year)$($strDate.Month)$($strDate.Day)"
Write-Output $strday

Ответ 14

Кажется, я изо всех сил пытаюсь справиться с этим (и многими другими неинтуитивными вещами) каждый раз, когда я пользуюсь PowerShell после этого, поэтому теперь выбираю:

[string]::Concat("There are ", $count, " items in the list")

Ответ 15

(Текущая версия PS 5.1.17134.407)

Я думаю, все это уже сделано и сделано, но это также работает и сейчас:

$myVar = "Hello"

echo "${myVar} World"

Ответ 16

Write-Host может также соединить это:

Write-Host $assoc.Id" - "$assoc.Name" - "$assoc.Owner

Это самый простой способ, ИМХО.

Ответ 17

$assoc = @{
    Id = 34
    FirstName = "John"
    LastName = "Doe"
    Owner = "Wife"
}

$assocId = $assoc.Id
$assocFN = $assoc.FirstName
$assocLN = $assoc.LastName
$assocName = $assocFN, $assocLN -Join " "
$assocOwner = $assoc.Owner

$assocJoin = $assocId, $assocName, $assocOwner -join " - "
$assocJoin
#Output = 34 - John Doe - Wife

Ответ 18

Просто для удовольствия. Вы также можете получить доступ к значениям PSObject напрямую, как показано ниже:

$assoc.psobject.Properties.value -join " - "

Но если вы не укажете, что объект должен быть упорядочен, Powershell отобразит значения в случайном порядке. Поэтому следует добавить флаг [заказано]

$assoc = [pscustomobject] [ordered] @{
    Id = 42
    Name = "Slim Shady"
    Owner = "Eminem"
}

Ответ 19

Попробуйте следующее:

$name = "Slim Shady"
Write-Host "My name is " $name