2009-04-09 16 views
1

なぜこのスクリプトの文字列連結に違いがあるのか​​分かりません。 空白がどこから来ているのか分かりません。 何が間違っているのか教えていただけますか?ハッシュテーブルのキーに末尾の空白があるのはなぜですか?

$table = @{ 
"aaa"=1 
} 

$x = "qqq" 
$y = "rrr" 

$table.GetEnumerator() | ForEach-Object { 
Write-Host $_.Key$x   #THIS PRINTS "aaa qqq" 
} 


Write-Host $x$y #THIS PRINTS : "qqqrrr" 

答えて

8

コマンドの引数を処理し、PowerShellのパーサーは、個別の引数に隣接表現を分割します。 PowerShellはオブジェクトベースなので、文字列にレンダリングする必要があるまでオブジェクトの整合性を保持しようとします。文字列展開を強制したい場合は、引数のシーケンス全体を二重引用符で囲み、他のポスターの1つとして指定します。 $ xのような先頭の文字を持つ引数は、二重引用符で囲まれた文字列 "a $ x"のように扱われることに注意してください。これは、先頭の文字が有効な式として認識されないため、デフォルトでは展開可能な文字列として扱われるためです。

-bruce

ブルース・ペイエット、 Windows PowerShellのチーム、 マイクロソフト社

+0

あなたの答えBruceに感謝します。私はそれから多くを学んだ。 – teebot

0

キーと$ xを連結するとどうなりますか?

$ _キー+ $ X

書き込みホストはあなたが入力変数をすることができます構文を持っているようだと、それはそれらを分離します:書き込みのホストを(a、b、c)は、-separator "_"

おそらくあなたが使用しているのはそのことの省略形ですか?

+0

$ table.GetEnumerator()|%{。$ _キー+ $ xに} aaaqqqが得られます。したがって、キーの後には間違いなく空白になります。 Write-Hostは読書を楽にすると思います。しかし、なぜそれが$ x $ yでないのか分かりません。 – Joey

2

ハッシュテーブルのキーだけでは発生しません。例えばこれを見て:

PS > Write-Host $x.Length$y 
3 rrr 

しかし$x.Length$yは有効な式ではありません。

PS > $x.Length$y 
Unexpected token 'y' in expression or statement. 
At line:1 char:11 
+ $x.Length$y <<<< 

だから何が起こってしなければならないことはPowerShellは、ホストを書くためにそれらを渡す前$x.Length$y 2などの個別の表現を解釈していることですそれらのうちの2つが存在するため、Write-Hostはそれらを区切り文字で区切ります。その後、

だから何がここで起こっている?:

PS > Write-Host $x$y 
qqqrrr 

$x$yは、いずれかの有効な式ではありません。

PS > $x$y 
Unexpected token 'y' in expression or statement. 
At line:1 char:4 
+ $x$y <<<< 

しかし、二重引用符でそれが有効な文字列です:

PS > "$x$y" 
qqqrrr 

Powershellは、Write-Host aに渡す前に$x$yを文字列に変換する必要があります1つの引数。

しかし、基本的にはすべてがちょっとしたことです。それは私にとってもっともらしい。短い答えはあなたがスペースを取り除くために一緒に自分自身をあなたの文字列を連結することができるということです。

Write-Host ($_.Key + $x) 
+0

私はあなたの考えに同意します。私はそれがPowerShellチームのコメントなしで得られるほど近いと考えています。 – JasonMArcher

1

IMHO、PowerShellのパーサーは

Write-Host $_.Key$a 

そして、上分割して二つの式にそれをトークン化を取っています'$'。実際には、パイプラインに2つのコマンドを発行:

Write-Host $_.Key 
$x 

私はあなたがプロパティにアクセスし、評価されたときは、文字列になるという変数に次の文字列にそれを拡大しているので、これはほとんどだと思います。

あなたがこれをやるべき方法は次のとおりです。

PS C:\Users\jpogran> $table = @{ 
>> "aaa"=1 
>> } 
>> 
PS C:\Users\jpogran> $x = "qqq" 
PS C:\Users\jpogran> $y = "rrr" 
PS C:\Users\jpogran> $table 

Name       Value 
----       ----- 
aaa       1 
PS C:\Users\jpogran> $table.Getenumerator() | %{ Write-host "$($_.key)$x" } 
aaaqqq 

「$()」そのオブジェクトのプロパティが展開され、値が次に来るものは何でもする文字列に置くことにしたいPowerShellのパーサーを伝えます前後に。()を$と同様に最初のフラグメントが認識発現がある場合

ジェームズ

関連する問題