2011-01-06 11 views
0

私は、配列上のforeachループを持つスクリプトを持っており、現在のオブジェクトを持つ文字列を使用しているはずです。しかし、文字列が適切に拡張されていません。

$Patterns = ("An", "array", "of", "strings") 
$Template = "The current item is $_" 

$Patterns | foreach { Does-Something $Template } 

does-somethingの出力はテンプレート文字列を変数に置きますが、挿入することはありません。これは、foreach文と明示的な変数名を使用すると機能します。この仕事をするためには何を変更する必要がありますか?

EDIT:だから問題は、私ということです

$OutFile = "C:\Searched.txt" 
$Path = "C:\Dev\Folder\To\Search" 
$Patterns = ("Big", "Array", "of", "things", "to", "search") 

$exp = @{Expression={$_.FileName};Label="File Name"}, ` 
     @{Expression={$_.LineNumber};Label="Line #"}, ` 
     @{Expression={$_.Path.Substring($Path.Length)};Label="Path ($Path)"}, ` 
     @{Expression={$_.Line.Trim()};Label="Line ($_)"} 

$Patterns | foreach { 
get-childitem ($Path + "*") -include *.cs -recurse ` 
| select-string -pattern ($_ + "TableAdapter") ` 
| format-table $exp -AutoSize } 

を:

[OK]を、私は理解に誤りがあったが、重要な何かを残し、そう私は実際のコードを投稿してみましょう私が使用しています愚かなことに、フォーマットテーブルに渡されている式ハッシュテーブルに$_が埋め込まれていますが、フォーマットテーブルには$_式が必要です。だから私は実際に必要な文字列で外側のスコープにアクセスすることはできません。

これを回避する方法はありますか?

答えて

1

これはあなたのための文字列の拡張を行う必要があります

$Patterns | foreach {Does-Something $executioncontext.InvokeCommand.ExpandString($Template)} 

を試してみてください。

+0

ああ...実際には、ここで何が起こっているのか私には明らかにしている、私が何かを逃しました。質問を更新するつもりです。 – CodexArcanum

+0

ファイルをパラメータとして受け取り、format-table($ exp)の列のリストを返す関数を作成するにはどうすればよいですか?そのような頭痛を排除するように見えます。 –

0

$_を外側のスコープから使用しているとは思われません。しかし、最も簡単な解決策は、単に各反復でラベルを変更されるよりも、あなたが、foreachから外側のスコープを使用してのは、あなたが名前"Line for pattern $_"と最後の列を持っているしたいと仮定しましょう:

... 

$Patterns | foreach { 
    $exp[-1].Label = "Line for pattern $_"  # <<- this one 

    get-childitem ($Path + "*") -include *.cs -recurse ` 
    | select-string -pattern ($_ + "TableAdapter") ` 
    | format-table $exp -AutoSize 
    } 
0

それは何のように思えます本当に必要なのは、ループが実行された時点で評価される関数です。たぶん$expscriptblockにすることができます。私が何を意味するかの簡単な例:

PS C:\> $func = [scriptblock]{ 'prefix' + $_ } 
PS C:\> @('x', 'y', 'z') | Foreach-object { Write-host (& $func) } 
prefixx 
prefixy 
prefixz 
PS C:\> 

それとも、関数を定義する:

PS C:\> function func() { 'prefix' + $_ } 
PS C:\> @('x', 'y', 'z') | Foreach-object { Write-host (func) } 
prefixx 
prefixy 
prefixz 
PS C:\> 

スクリプトブロックまたは機能に$_を参照することにより、それが呼び出されたときに評価されていない前にされます。

またはご希望の場合は、パラメータとして入力オブジェクトを取るためにscriptblock /関数を定義することがあります。

PS C:\> function func($x) { 'prefix' + $x } 
PS C:\> @('x', 'y', 'z') | Foreach-object { Write-host (func $_) } 
prefixx 
prefixy 
prefixz 
PS C:\> 
関連する問題