Расширение переменной на $ _ в foreach-объекте? - PullRequest
0 голосов
/ 06 января 2011

У меня есть скрипт с циклом foreach над массивом, и он должен использовать строку с текущим объектом в нем.Но строка не расширяется должным образом.

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

$Patterns | foreach { Does-Something $Template }

Выходные данные типа «что-то делает» просто помещают строку шаблона в переменную, но не вставляют ее.Это работает, если я использую оператор foreach и явное имя переменной.Что мне нужно изменить, чтобы сделать эту работу?

РЕДАКТИРОВАТЬ:

Хорошо, у меня была ошибка в понимании, и я упустил что-то важное, поэтому позвольте мне опубликовать фактический код, который яusing:

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

Таким образом, проблема в том, что я по глупости включил $_ в хеш-таблицу выражения, которая передается в формат-таблицу, но для формата-таблицы нужно само выражение $_.Поэтому я не могу получить доступ к внешней области видимости с нужной мне строкой.

Теперь, есть ли способ обойти это?

Ответы [ 3 ]

1 голос
/ 06 января 2011

Попробуйте

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

Это должно сделать расширение строки для вас.

0 голосов
/ 12 января 2013

Кажется, что вам действительно нужна функция, вычисляемая во время выполнения цикла. Может быть, вы можете сделать $exp 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:\>
0 голосов
/ 07 января 2011

Я не вижу, чтобы вы использовали $_ из внешней области видимости. Но давайте предположим, что вы хотели бы иметь последний столбец с именем "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 
  }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...