2012-03-02 15 views
6

これに対する答えは簡単ではありませんが、私は30分を費やしてもまだ解決できません。ハッシュテーブル値を含むPowershell文字列の書式設定

は、私は以下のハッシュテーブルがあるとします。私が何をしようとしている何

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

を、出力側に沿っていくつかの他の文字列要素「顔」の値です。

これは動作します:

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

はしかし、これはしません:

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

どういうわけか、スペースの不足は、演算子の優先順位に影響を与えている - それは今文字列として$ハッシュを評価しています、後に連結する[顔]。この優先順位の問題を解決しようとすると

は、私が試した:

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

私は今、私はしたくない余分なスペースを持っています。 これは動作しますが、私はちょうど再割り当てするために余分な行をしたくない:

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

任意のアイデアどのようにワンライナーとしてこの作業を取得しますか?

答えて

9

確かに、部分式を使用します。この中で、

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

はい:私は書き込みホストとの空白を正確に制御する必要がある場合、私はちょうど、文字列を使用したい一般

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

を文字列に$foo['bar']のような式を含めることはできません。

ところで、$hash.faceは、はるかに少ない視覚的な混乱でも同様に機能します。

+0

部分式がここで鍵となった($で囲みます())。私は彼らの役割が曖昧であることを認識していましたが、ここでの適用性を欠いていました。 – llevera

+0

他人に回答する機会を与えられない。ブロックから少し速かった – llevera

3

もっと多くの変数が関わっている場合は、文字列の書式設定を使用することをお勧めします。この場合には、あなたが$(..)と一緒に暮らすことができますが、その文字列の書式に注意して、疑いの多くを削除嫌なものや読みやすさを向上させます。

write-host ("Face/{0}" -f $hash['face']) 
+0

-fオプションを指摘してくれてありがとう。私は決してそれを使用していないだろうし、もっと複雑なシナリオをどのように扱いやすくするのかがはっきりとわかる。 – llevera

+1

llevera、それはオプションではなくオペレータだ。 – Joey

1

ジョーイとしてサブ表現を使用する以外にすることができます示した:

を使用列の書式:これは、{0}

使用文字列連結の代わりに、顔のキーの値を固執する

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

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

それらの両方がWrite-HostObjectパラメータとして使用される文字列を出力する評価する式を必要とします。

+0

Write-Host( 'Face /' + $ hash.face)の例では、角括弧が重要であることに注意してください。それらがなければ、+は文字列リテラルとして扱われます。 Powershellの文字列の書式設定には少し慣れています! – llevera

+0

@lleveraそうでないと、PowerShellは文字列の連結を最初に実行するように指示します。出力は 'Write-Host -Object'パラメータ値として使用されるSystem.Stringオブジェクトです。 –

0

別のオプションは、書き込みホストの-separatorオプションであなたのスラッシュを挿入することです:

$hash = @{Face="off"} 
Write-Host ("Face",$hash.Face) -Separator '/' 
関連する問題