Предположим, у меня есть следующий фрагмент:
$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, стр. 34, расширение подвыражений.
Кажется, никто не упомянул о разнице между одинарные и двойные кавычки. (Я с помощью PowerShell 4).
Вы можете сделать это (как @Бен сказал):
$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
Вы также можете использовать присоединиться
Е. Г.
$name = -join("Jo", "h", "n");
Назначить на "Джон" до $имя.
Так для вывода в одну строку:
Write-Host (-join("Jo", "h", "n"))
Попробуйте оборачивать все, что вы хотите распечатать в скобках:
Write-host ($assoc.Id + " - " + $assoc.Name + " - " + $assoc.Owner)
Ваш код интерпретируется как многие параметры передаются писать-хост. Окружив его внутри скобок будет объединить значения и затем передают полученное значение в качестве одного параметра.
Другой вариант:
$string = $assoc.ID
$string += " - "
$string += $assoc.Name
$string += " - "
$string += $assoc.Owner
Write-Host $string
В "лучших" и способ является, пожалуй, одним С. Б. предложил:
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 будет следовать только на "питон" или "Лок" в скобках правил позволяет поставить столько строк, сколько вы хотите между начальной и конечной скобки, то они бы решить большинство проблем, которые люди не'т, как о PowerShell, связанные с продолжением линии, и конкатенации строк. Я'ве обнаружили, что вы можете оставить обратно-клещей с иногда на линии продолжения в скобках, но очень холодные и unpredicatable, если он будет работать.. лучше просто добавить в обратные кавычки.)
Вот еще один способ как альтернатива:
Write-host (" {0} - {1} - {2}" -f $assoc.Id, $assoc.Name, $assoc.Owner)
Просто я хочу найти другой способ сделать это с помощью .Чистая [строка.Формат][1]:
$name = "Slim Shady"
Write-Host ([string]::Format("My name is {0}", $name))
[1]: https://msdn.microsoft.com/en-us/library/system.string.format(в=против 110).аспн
Из Что делать / не делать в PowerShell: Часть 1:
$id = $assoc.Id
$name = $assoc.Name
$owner = $assoc.owner
"$id - $name - $owner"
Конкатенация строк так как во времена Дос. Это очень важно для лесозаготовки, поэтому здесь вы идете:
$strDate = Get-Date
$strday = "$($strDate.Year)$($strDate.Month)$($strDate.Day)"
Write-Output "$($strDate.Year)$($strDate.Month)$($strDate.Day)"
Write-Output $strday
Эти ответы все кажется очень сложным. Если вы используете это в скрипт PowerShell, вы можете просто сделать это:
$name = 'Slim Shady'
Write-Host 'My name is'$name
Он будет выводить
меня зовут Слим Шейди
Обратите внимание, как пробел ставится между словами для вас
Мне кажется, бороться с этим (и многим другим сложным вещам) каждый раз, когда я использовать PowerShell После время вдали от него, поэтому сейчас я выбираю:
[string]::Concat("There are ", $count, " items in the list")
Написать-узла может объединить так:
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"
}