Как объединить строки и переменные в 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?

+396
27 февр. '13 в 13:34
источник поделиться
17 ответов
Write-Host "$($assoc.Id) - $($assoc.Name) - $($assoc.Owner)"

См. Спецификация Windows PowerShell 3.0, версия p34, подвыражения.

+415
27 февр. '13 в 13:37
источник

Связанные вопросы


Похожие вопросы

Никто, кажется, не упомянул разницу между одиночными и двойными кавычками. (Я использую 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 Я считаю полезным для справки).

+139
08 сент. '15 в 10:25
источник

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

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
+105
27 февр. '13 в 13:37
источник

Чтобы объединить две строки для хранения в переменной/использовать в функции, вы можете использовать -join.

например.

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

Назначит "Джон" $name.

Итак, для вывода в одной строке:

Write-Host (-join("Jo", "h", "n"))
+45
11 янв. '16 в 11:34
источник

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

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

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

+42
27 февр. '13 в 13:37
источник

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

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

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

Write-host "$($assoc.Id)  -  $($assoc.Name)  -  $($assoc.Owner)"
+18
27 февр. '13 в 13:49
источник

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

Write-host ($assoc.Id + "  -  "  + $assoc.Name + "  -  " + $assoc.Owner)
+14
27 февр. '13 в 13:36
источник

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

"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.)

+12
11 сент. '17 в 0:15
источник

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

Write-host (" {0}  -  {1}  -  {2}" -f $assoc.Id, $assoc.Name, $assoc.Owner)
+10
27 февр. '13 в 13:42
источник

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

$name = "Slim Shady"
Write-Host ([string]::Format("My name is {0}", $name))
+8
26 мая '16 в 18:11
источник

Из Что делать/не делать в PowerShell: Часть 1:

$id = $assoc.Id
$name = $assoc.Name
$owner = $assoc.owner
"$id - $name - $owner"
+6
28 февр. '13 в 21:08
источник

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

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

Он выведет

Меня зовут Slim Shady

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

+6
05 мая '15 в 21:21
источник

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

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

Write-Output "$($strDate.Year)$($strDate.Month)$($strDate.Day)"
Write-Output $strday
+4
16 сент. '16 в 22:38
источник

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

[string]::Concat("There are ", $count, " items in the list")
+3
19 апр. '17 в 8:23
источник

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

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

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

+2
22 мая '17 в 17:05
источник

Думаю, все уже сказано и сделано, но это тоже работает (немного похоже на пост Мартина Брандла):

$myVar = "Hello"

echo "${myVar} World"
0
13 дек. '18 в 14:41
источник

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

$name = "Slim Shady"
Write-Host "My name is " $name
-6
29 апр. '15 в 12:10
источник

Посмотрите другие вопросы по меткам или Задайте вопрос