Подтвердить что ты не робот

Как я могу получить доступ к переменной уровня $_ верхнего уровня из вложенного конвейера?

Я пишу script, который будет смотреть на каталог Parent VHD файлов, а затем оценивать, какие виртуальные машины используют эти родительские VHD.

У меня есть механика работы, но я столкнулся с проблемой, когда мне действительно нужно ссылаться на автоматическую переменную конвейера ($ _) из контекста вложенного конвейера

Код sudo будет выглядеть примерно так:

For each File in Files
Iterate over all VMs that have differencing disks
and return all the VMs that have a disk whose parent disk is File

Вот фактический код powershell, который я выполнил до сих пор, чтобы сделать это:

$NAVParentFiles = get-childitem '\\hypervc2n2\c$\ClusterStorage\Volume1\ParentVHDs' | where {$_.Name -notLike "*diff*"} | select name
$NAVParentFiles | % { Get-VM | where {$_.VirtualHardDisks | where {$_.VHDType -eq "Differencing" -and ($_.ParentDisk.Location | split-path -leaf) -like <$_ from the outer for each loop goes here> } } 

Спасибо за любую помощь, которую вы можете предоставить мне о том, как элегантно получить доступ к внешней переменной конвейера из вложенного конвейера.

4b9b3361

Ответ 1

Вы можете назначить $_ переменной и использовать ее?

 1..10 | %{ $a = $_; 1..10 | %{ write-host $a} }

В любом случае, рассмотрите возможность рефакторинга script. Он слишком вложен. Сосредоточьтесь на удобочитаемости. Это не всегда необходимо для соединения, вы можете использовать цикл foreach, если это помогает улучшить читаемость.

Ответ 2

У меня нет этой команды, но, возможно, здесь можно использовать общий параметр -pipelinevariable.

Get-VM -PipelineVariable vm | Get-VHD |
  Select-Object @{n='Name'; e={$vm.name}}, path, parentpath