Ответ 1
Write-Host "$($assoc.Id) - $($assoc.Name) - $($assoc.Owner)"
См. Спецификация Windows PowerShell 3.0, версия p34, подвыражения.
Предположим, у меня есть следующий фрагмент:
$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?
Write-Host "$($assoc.Id) - $($assoc.Name) - $($assoc.Owner)"
См. Спецификация Windows PowerShell 3.0, версия p34, подвыражения.
Никто, кажется, не упомянул разницу между одиночными и двойными кавычками. (Я использую 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 Я считаю полезным для справки).
Один из способов:
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
Вы также можете использовать -join
Э.Г.
$name = -join("Jo", "h", "n");
Назначил бы "Джона" на $ name.
Итак, вывести в одну строку:
Write-Host (-join("Jo", "h", "n"))
Попробуйте обернуть все, что вы хотите распечатать в скобках:
Write-host ($assoc.Id + " - " + $assoc.Name + " - " + $assoc.Owner)
Ваш код интерпретируется как количество параметров, передаваемых в Write-Host
. Объединение его в скобки приведет к объединению значений, а затем передаёт результирующее значение как один параметр.
Другой вариант:
$string = $assoc.ID
$string += " - "
$string += $assoc.Name
$string += " - "
$string += $assoc.Owner
Write-Host $string
"Лучший" метод, вероятно, является тем, который предложил C.B.
Write-host "$($assoc.Id) - $($assoc.Name) - $($assoc.Owner)"
Вам нужно поместить выражение в круглые скобки, чтобы они не обрабатывались как параметры для командлета:
Write-host ($assoc.Id + " - " + $assoc.Name + " - " + $assoc.Owner)
Пока выражение:
"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.)
Вот альтернативный вариант:
Write-host (" {0} - {1} - {2}" -f $assoc.Id, $assoc.Name, $assoc.Owner)
Я просто хочу использовать другой способ, используя .NET String.Format:
$name = "Slim Shady"
Write-Host ([string]::Format("My name is {0}", $name))
Из Что делать/не делать в PowerShell: Часть 1:
$id = $assoc.Id
$name = $assoc.Name
$owner = $assoc.owner
"$id - $name - $owner"
Эти ответы кажутся очень сложными. Если вы используете это в PowerShell script, вы можете просто сделать это:
$name = 'Slim Shady'
Write-Host 'My name is'$name
Он выведет
Меня зовут Slim Shady
Обратите внимание, как между вашими словами вы помещаете пробел
Объединить строки так же, как в дни DOS. Это очень важно для ведения журнала, так что вы идете:
$strDate = Get-Date
$strday = "$($strDate.Year)$($strDate.Month)$($strDate.Day)"
Write-Output "$($strDate.Year)$($strDate.Month)$($strDate.Day)"
Write-Output $strday
Кажется, я изо всех сил пытаюсь справиться с этим (и многими другими неинтуитивными вещами) каждый раз, когда я пользуюсь PowerShell после этого, поэтому теперь выбираю:
[string]::Concat("There are ", $count, " items in the list")
(Текущая версия PS 5.1.17134.407)
Я думаю, все это уже сделано и сделано, но это также работает и сейчас:
$myVar = "Hello"
echo "${myVar} World"
Write-Host может также соединить это:
Write-Host $assoc.Id" - "$assoc.Name" - "$assoc.Owner
Это самый простой способ, ИМХО.
$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
Просто для удовольствия. Вы также можете получить доступ к значениям PSObject напрямую, как показано ниже:
$assoc.psobject.Properties.value -join " - "
Но если вы не укажете, что объект должен быть упорядочен, Powershell отобразит значения в случайном порядке. Поэтому следует добавить флаг [заказано]
$assoc = [pscustomobject] [ordered] @{
Id = 42
Name = "Slim Shady"
Owner = "Eminem"
}
Попробуйте следующее:
$name = "Slim Shady"
Write-Host "My name is " $name