Предположим, у меня есть следующий фрагмент:
$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?
powershell
string-concatenation
Ниндзя пастушка
источник
источник
Write-host ($assoc.Id.ToString() + " - " + $assoc.Name + " - " + $assoc.Owner)
заключаете выражение в круглые скобки: здесь $ assoc.Id,Int32
поэтому мы должны использовать его строковое представление. В противном случае PS пытается выполнить арифметическое сложение вместо конкатенации.Ответы:
См. Спецификацию языка Windows PowerShell версии 3.0 , p34, расширение подвыражений.
источник
Write-Output
другими , поэтому, вероятно, он наиболее полезен в вашем наборе инструментов."... $name ..."
будет работать все равно, но в оригинальном вопросе, для которого этот ответ обращается, вопрос заключается в том, как получить доступ к свойствам объекта. так что если$name.id -eq 42
тогда"... $name.id ..."
не будет работать так, как вы хотите, потому что он будет отображаться как... @{id=42}.id ...
вместо желаемого... 42 ...
Для этого используйте метод ответа"... $($name.id) ..."
. Я ставлю вопрос о закладках для редактирования позже.Кажется, никто не упомянул разницу между одинарными и двойными кавычками. (Я использую PowerShell 4).
Вы можете сделать это (как сказал @Ben):
Или вы можете сделать это:
Одинарные кавычки для литерала, выведите строку точно так же, как это, пожалуйста. Двойные кавычки предназначены для предварительной обработки (например, переменных, специальных символов и т. Д.)
Так:
В то время как:
( http://ss64.com/ps/syntax-esc.html Я считаю хорошим для справки).
источник
Одним из способов является:
Еще один:
Или просто (но мне это не нравится;))
источник
$assoc.Id
и"
(и др.). То есть вариант 1 дает вамId__-__Name__-__Owner
(два пробела с каждой стороны каждого-
), но вариант 3 даетId___-___Name___-___Owner
( три пробела).$assoc.Id"###"$assoc.Name
будет добавлять пробела в обеих стороны от ###, где"$($assoc.Id)###$($assoc.Name)"
не будет .Вы также можете использовать
-join
Например
Назначил бы «Джон» на $ name.
Итак, вывести в одну строку:
источник
Попробуйте обернуть все, что вы хотите распечатать в скобках:
Ваш код интерпретируется как множество параметров, передаваемых
Write-Host
. Заключение его в круглые скобки объединит значения, а затем передаст полученное значение как один параметр.источник
Write-Debug
илиWrite-Verbose
для включения двойных кавычек и значений переменных, таких какWrite-Debug ('Running "cmdlet" with parameter $MyVar = ' + $MyVar + " at time " + (Get-Date -DisplayHint Time))
Другой вариант:
«Лучшим» методом, вероятно, является тот, который предложил CB:
источник
StringBuilder
опцию, если вы сходите с ума. ; ^)Вы должны поместить выражение в скобки, чтобы они не обрабатывались как командлет:
источник
Пока выражение:
объединит строки. Вам нужно поставить $ перед скобками, чтобы он передавался как один аргумент при передаче в команду powershell. Пример:
В качестве бонуса, если вы хотите, чтобы он занимал несколько строк, вам нужно использовать синтаксис обратного обратного удара в конце строки (без пробелов или символов справа от обратного удара). Пример:
(На самом деле, я думаю, что Powershell в настоящее время реализован немного неправильно, поскольку требует лишних обратных тиков между круглыми скобками. Если бы Microsoft просто следовала правилам скобок "Python" или "TCL", позволяющим вам ставить столько строк перевода, сколько вы хотите между началом и заканчивая круглые скобки, тогда они решат большинство проблем, которые не нравятся людям в PowerShell, связанных с продолжением строки и конкатенацией строк. Я обнаружил, что иногда можно оставить галочку на продолжениях строки между скобками, но это действительно ненадежный и непредсказуемый, если он будет работать .. лучше просто добавить обратные пометки.)
источник
Вот другой способ в качестве альтернативы:
источник
Я просто хочу привести другой способ сделать это с помощью .NET String.Format :
источник
String.Format
вместо старой простой"{0}" -f $var
? Я не вижу смысла в использовании .NET-кода, когда обычная PowerShell может выполнять эту работу ...(Текущая версия PS 5.1.17134.407)
Это все сказано и сделано к настоящему времени, я думаю, но это также работает на данный момент:
Примечание: это работает только с двойными кавычками
источник
Все эти ответы кажутся очень сложными. Если вы используете это в скрипте PowerShell, вы можете просто сделать это:
Будет выводить
Обратите внимание, как для вас ставится пробел между словами
источник
От Что делать / не делать в PowerShell: Часть 1 :
источник
Конкатенация строк, как в дни DOS. Это большое дело для регистрации, так что здесь вы идете:
источник
toString
вариант проще:(Get-Date).toString('yyyyMMdd')
Я, кажется, борюсь с этим (и многими другими не интуитивными вещами) каждый раз, когда я использую PowerShell, после того как время отошло от него, поэтому теперь я выбираю:
источник
Write-Host также может объединяться следующим образом:
Это самый простой способ, ИМХО.
источник
источник
Если вы объединяете строки для создания путей к файлам, используйте команду join-path:
Он автоматически добавит подходящие косые / ведущие слэши для вас, что намного упростит задачу.
Я извиняюсь, если это слишком не по теме, но я подумал, что это может помочь некоторым.
Если я некоторое время не использую PowerShell, иногда я забываю о его существовании и начинаю искать операторы конкатенации.
источник
Вы также можете получить доступ к методам C # / .NET, и следующее также работает:
источник
Просто для удовольствия. Вы также можете получить доступ к значениям PSObject напрямую, как показано ниже:
Но если вы не укажете, что объект должен быть упорядочен, Powershell отобразит значения в случайном порядке. Поэтому следует добавить флаг [заказано]
источник