Форматирование строки Powershell, содержащей значения хеш-таблицы - PullRequest
6 голосов
/ 03 марта 2012

Ответ на этот вопрос, вероятно, будет тривиальным, но я потратил полчаса и до сих пор не могу его решить.

Предположим, у меня есть следующая хеш-таблица:

$hash = @{face='Off';}

То, что я пытался сделать, это вывести значение "face" вдоль стороны некоторых других строковых элементов.

Это работает:

Write-Host Face $hash['face']
=> Face Off

Однако это не так:

Write-Host Face/$hash['face']
=> Face/System.Collections.Hashtable[face]

Каким-то образом отсутствие пробела повлияло на приоритет оператора - теперь он оценивает $ hash как строку, а затем объединяет [face].

Пытаясь решить эту проблему приоритета,Я попытался:

Write-Host Face/($hash['face'])
=> Face/ Off

Теперь у меня есть дополнительное место, которое я не хочу.Это работает, но я не хочу, чтобы дополнительная строка просто переназначалась:

$hashvalue = $hash['face']
write-host Face/$hashvalue
=> Face/Off

Есть идеи, как заставить это работать как однострочный?

Ответы [ 4 ]

9 голосов
/ 03 марта 2012

Конечно, используйте подвыражение:

Write-Host Face/$($hash['face'])

Как правило, я бы просто использовал строку, если мне нужен точный контроль над пробелами с помощью Write-Host:

Write-Host "Face/$($hash['face'])"

Да, в этом случае вам снова нужно подвыражение, но больше, потому что вы просто не можете включить выражение типа $foo['bar'] в строку в противном случае; -)

Кстати, $hash.face работает так же хорошо снамного меньше визуального беспорядка.

3 голосов
/ 03 марта 2012

В таких случаях, и более того, если задействовано больше переменных, я предпочитаю использовать форматирование строк.Хотя в этом случае вы можете жить с $(..), имейте в виду, что форматирование строк уберет много сомнений, лишних деталей и улучшит читабельность:

write-host ("Face/{0}" -f $hash['face'])
1 голос
/ 03 марта 2012

В дополнение к использованию подвыражений, как показал Джои, вы можете:

Использовать форматирование строки:

Write-Host ('Face/{0}' -f $hash.face)

Это поместит значение ключа лица вместо {0}

Использовать конкатенацию строк:

Write-Host ('Face/' + $hash.face)

Для обоих из них требуется вычисление выражения, которое выводит строку, которая используется как Write-Host параметр Object.

0 голосов
/ 03 марта 2012

Другой вариант - вставить косую черту с опцией -Separator в Write-Host:

$hash = @{Face="off"}
Write-Host ("Face",$hash.Face) -Separator '/'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...