link611
Goto Top

Powershell, Foreach mit Ausnahme - Hyper-V Backup

Hi,

Ich habe ein Powershell script, welches Sämtliche Virtuelle Maschinen vom Hyper-V auf den gespeichert Zustand versetzt dann exportiert und dann wieder startet.

$VM_Service = get-wmiobject -namespace root\virtualization Msvm_VirtualSystemManagementService

$ListofVMs = get-wmiobject -namespace root\virtualization Msvm_ComputerSystem -filter  "ElementName <> Name"    

 

foreach ($VM in [array] $ListOfVMs)

{

                    $VMReturnState = $VM.EnabledState

                    $VMName = $VM.ElementName

 

                    if (($VM.EnabledState -eq 2) -or ($VM.EnabledState -eq 32768) -or ($VM.EnabledState -eq 32770))

                    {

                                         $VM.RequestStateChange(32769)

                                         echo "Saving the state of $VMName"  

                    }

 

                    while (!($VM.EnabledState -eq 32769) -and !($VM.EnabledState -eq 3))

                    {

                                         Start-Sleep(1)

                                         $VM = get-wmiobject -namespace root\virtualization -Query "Select * From Msvm_ComputerSystem Where ElementName='$VMName'"  

                    }

 

 

                    if ([IO.Directory]::Exists("$dest\TmpDir\$VMName"))  

                    {

                                         [IO.Directory]::Delete("$dest\TmpDir\$VMName", $True)  

                    }

 

                    echo "Exporting the VM"  

                    $status = $VM_Service.ExportVirtualSystem($VM.__PATH, $True, "$dest\TmpDir")  

                                        

                    if ($status.ReturnValue -eq 4096)

                    {

                                         $job = [Wmi]$status.Job                    

                   

                                         while (!($job.PercentComplete -eq 100) -and ($job.ErrorCode -eq 0))

                                         {

                                                             Start-Sleep(5)

                                                             $job = [Wmi]$status.Job                    

                                                             echo $job.PercentComplete

                                         }

                    }

 

 

                    ##                Store the files on in a temp directory before moving them to their location and then remove the old files.

 

                    if ([IO.Directory]::Exists("$dest\$VMName"))  

                    {

                                         [IO.Directory]::Move("$dest\$VMName", "$dest\$VMName-OldTmpDir")  

                                         [IO.Directory]::Move("$dest\TmpDir\$VMName", "$dest\$VMName")  

                                         [IO.Directory]::Delete("$dest\$VMName-OldTmpDir", $True)  

                    }

                    else

                    {

                                         [IO.Directory]::Move("$dest\TmpDir\$VMName", "$dest\$VMName")  

                    }

                   

                    echo "Done with $VMName"  

                    $VM.RequestStateChange($VMReturnState)

}


Jetzt soll aber eine VM des pools nicht mitgesichert werden.

Wie kann ich das realisieren?


MfG

Content-Key: 166340

Url: https://administrator.de/contentid/166340

Printed on: April 18, 2024 at 15:04 o'clock

Member: danielmuc
danielmuc May 16, 2011 at 11:55:28 (UTC)
Goto Top
Hi,

einfach das Array per Schleife in ein anderes kopieren und dabei ne Abfrage rein welche die nicht zu sicherende VM überspringt.

Zeilen aus Arrays können soweit mir bekannt in PS nicht gelöscht werden, nur deren Inhalt auf z.b. NULL gesetzt werden.
Hab mir deinen Code nciht komplett durchgelesen wie es da mit dem Error Handling ausschaut wenn das Array einen ungültigen Wert besitzt...


siehe:

http://www.colorconsole.de/PS_Windows/de/about_arrays.htm

suche nach:

BEARBEITEN EINES ARRAYS

Greatz Daniel.
Member: micneu
micneu May 16, 2011 at 12:16:48 (UTC)
Goto Top
frag doch einfach die variable $VM ab und reagiere entsprechend

gruß michael
Member: link611
link611 May 16, 2011 at 12:29:37 (UTC)
Goto Top
Danke schon mal für die Hilfe, hat schon sehr weiter geholfen.

Hab nur noch ein Problem:

$t = $a[0,1 + 3..($a.length - 1)] 

Den Teil mit dem 3..($a.length-1) bekomm ich noch nicht so ganz hin, dass der das Array von Position 3 an, bis zum Ende nimmt.


Und zwar bekomme ich die Meldung:

Der Wert "System.Object" kann nicht in den Typ "System.Int32" konvertiert werden.
Member: danielmuc
danielmuc May 16, 2011 at 12:47:04 (UTC)
Goto Top
Hi,

steht auch alles hier:

$a[2..($a.length-1)]

nicht verwundern wegen index wert 2 - der 1. datensatz fängt bei index an.


Wobei ich den Vorschlag von Micneu auch gut finde - einfach eine if Abfrage:

IF ($VM.ElementName -ne "NOBACKUPVM")
{
gogogo
}
else
...
Member: link611
link611 May 16, 2011 at 13:02:55 (UTC)
Goto Top
Wunderbar, funktioniert =)
Herzlichen Dank!


Hab' mittlerweile schon länger nicht mehr programmiert, deswegen hatte ich da nen kleinen Schwächeanfall ;D


Aber nochmal zu dem $a[2..($a.length-1)]

Da bekam ich vorhin den Fehler: Der Wert "System.Object" kann nicht in den Typ "System.Int32" konvertiert werden.


aber das wäre aber auch nicht so flexibel gewesen.


Also nochmal, Danke =)