Как я могу получить доступ к переменной уровня $_ верхнего уровня из вложенного конвейера?
Я пишу 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> } }
Спасибо за любую помощь, которую вы можете предоставить мне о том, как элегантно получить доступ к внешней переменной конвейера из вложенного конвейера.
Ответы
Ответ 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