2011-03-04 15 views
1

foreachで文字列値を使用するには?foreachで文字列値を使用する方法は?

次のように動作します。

$printString='$_.name+","+$_.name' 
Get-ChildItem|foreach {$_.name+','+$_.name} 

が、以下は

Get-ChildItem|foreach {$printString} 

を動作しません。しかし、私はそれが動作する必要があります:私はテーブル内の各列を印刷するタスクを持っているので、私は取得するには、テーブルの辞書を使用することができますすべての列は動的なので、結果を印刷しようとすると、上のような文字列を使用して結果を出力します。任意のソリューション

答えて

5

いくつかの解決策があります。私の中央に来たそれらのいくつかは:

$printString='$($_.name),$($_.name)' 
Get-ChildItem | % { $ExecutionContext.InvokeCommand.ExpandString($printString) } 

$formatString='{0},{0}' 
Get-ChildItem | % { $formatString -f $_.Name } 

$s = {param($file) $file.Name + "," + $file.Name } 
Get-ChildItem | % { & $s $_ } 

最初の1つは文字列を展開し、それはおそらくあなたが望むものです。合成変数は$(..)で囲む必要があります。 2つ目は入力をフォーマットするだけです。第三は、あなたが(最も強力な)したい任意の文字列を作成することができますがスクリプトブロックを使用しています

+0

さまざまなソリューションがあります。 –

2

一つの可能​​な解決策:

$printString={$_.name+","+$_.name} 
Get-ChildItem |foreach {.$printString} 
+0

それは動作します! $ pirntStringはスクリプトブロックですが、 "foreach {。$ printString}"のドットの意味は何ですか? –

+0

ドットは現在のスコープ内でスクリプトブロックを実行します。 – mjolinor

+0

foreach句に中括弧を残しておくこともできます。 "Get-ChildItem | foreach $ printString"も機能します。 – OldFart

2

もう1つの可能な解決策:

$printString='$_.name+","+$_.name' 
Get-ChildItem|foreach { Invoke-Expression $printString } 
+0

でも動作し、Invoke-ExpressionとExecutionContext.InvokeCommand.ExpandStringの違いは何ですか?同じように動作していますか? –

+0

彼らは実際にはかなり異なっています。 ExpandStringは、文字列内の変数と式を展開し、新しい文字列を生成します。 Invoke-Expressionは、PowerShellコマンドであるかのように文字列を実行します。 $ printStringは2つの例で異なって定義されていることに注意してください。 – OldFart

0

興味深い可能性:

dir | select @{Name='Name'; Expression={$_.Name, $_.Name}}