2011-01-06 46 views
0

我有一个foreach循环遍历数组的脚本,它应该使用包含当前对象的字符串。但是字符串没有正确扩展。

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

$Patterns | foreach { Does-Something $Template } 

do-something的输出只是将模板字符串放到变量中,但不插入它。如果我使用foreach语句和显式变量名称,这将起作用。我需要改变以做出这项工作?

编辑:

好吧,我理解了一个错误,而忽略了一些重要的东西,所以让我文章中,我使用的实际代码:

$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 } 

所以,问题是,我愚蠢地将$_嵌入到表达式散列表中,该散列表正在传递到格式表中,但format-table需要$_表达式本身。所以我实际上不能用我需要的字符串访问外部作用域。

现在有没有办法解决这个问题?

回答

1

尝试

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

这应该为你做的字符串扩张。

+0

,哦,那向我透露什么实际发生在这里,我错过了什么。去更新这个问题。 – CodexArcanum 2011-01-06 19:05:50

0

我看不出您从外部范围使用$_。但是让我们假设你想有最后一栏名称为"Line for pattern $_",因此会使用外部范围从foreach,比简单的解决办法只是改变标签在每次迭代:

... 

$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

好像你真正需要的是在循环运行时评估的功能。也许你可以制作$exp a scriptblock。我的意思一个简单的例子:

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:\>