2011-11-23 14 views
13

Estoy escribiendo un script que buscará en un directorio de archivos VHD principales y luego evaluará qué máquinas virtuales están usando esos VHDs principales.

tengo la mecánica del mismo trabajo, pero estoy corriendo en un problema por el que realmente necesito hacer referencia a una variable de tuberías automática ($ _) desde el contexto de una tubería anidada

El código sudo sería algo así como :

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 

este es el código real powershell he aplicado hasta ahora para hacer esto:

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

Gracias por cualquier ayuda que me puedan dar en cómo acceder elegantemente a una variable externa de la tubería desde una tubería anidada.

+0

A veces, nestead 'foreach'es es más legible que las tuberías anidadas. – stej

Respuesta

24

Puede asignar el $_ a una variable y usar eso?

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

De todos modos, considere refaccionar su secuencia de comandos. Está muy anidado. Concéntrese en la legibilidad. No siempre es necesario canalizar, puede utilizar un bucle foreach si eso ayuda a mejorar la legibilidad.

+0

Eso hizo el truco =). Estoy buscando refactorizar el código como sugirió y posiblemente ir a los bucles foreach anidados donde tenga sentido. –

Cuestiones relacionadas