Probléme Script Powershell 2.0 Sauvegarde Hyper-v

Probléme Script Powershell 2.0 Sauvegarde Hyper-v - Infrastructures serveurs - Systèmes & Réseaux Pro

Marsh Posté le 18-02-2014 à 17:36:11    

Bonjour à tous.
Il m'a été demandé de déplacer des sauvegardes de machine virtual sur Hyper-v.  
 
Actuellement les sauvegardes se fond en local "C: Virtual\BACKUPVM" sur ma machine. Mais la place est restreinte et il ne vas plus etre possibles de faire nos sauvegardes par manque de place.
J'ai tenté de modifier le script existant mais le résultat : pfff: n'a pas été celui voulu.
 
Les machines virtual tournent sur Hyper-v sous Windows 2008 r2 datacenters. Un script en powershell procède aux sauvegardes.
 
 
Voici là le script...
 
##
## Create a backup of all the vm's
##
 
$cheminlog="C:\RepLOG"  
$datejour=get-date -uformat "%Y-%m-%d"  
$fichierlog=$cheminlog+"\sauv_log_"+$datejour+".log"  
#==========================================================================  
# SETTING  : Démarrage du log  
#==========================================================================  
Start-Transcript -path $fichierlog
 
$dest = "C:\Virtual\BACKUPVM"
$VM_Service = get-wmiobject -namespace root\virtualization Msvm_VirtualSystemManagementService
$ListofVMs = get-wmiobject -namespace root\virtualization Msvm_ComputerSystem -filter  "ElementName <> Name and ElementName <> 'Vm001-test'and ElementName <> 'Vm002' and ElementName <> 'Vm003'"    
 
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 "*-*-*-*-*-*  Export de $VMName terminé *-*-*-*-*-*"
 $VM.RequestStateChange($VMReturnState)
}
#==========================================================================  
# SETTING : Arrêt du log  
#==========================================================================  
Stop-Transcript  
 
 
J'ai changé la variable $dest pour lui indique le nouveau chemin($dest = "\\serBack\Backup\VM" )
Les répertoires avec les noms de mes machines étaient presente mais vide.
 
 
Je ni arrive pas et j'ai PEUR de faire une bétize.

Reply

Marsh Posté le 18-02-2014 à 17:36:11   

Reply

Marsh Posté le 19-02-2014 à 14:48:16    

Alors j'aie fait une modifier la variable $dest = "vers nouveau partage" et ajouter $destTemp = "temp local"
 
$dest = "vers nouveau partage"
$destTemp = "temp local"
$VM_Service = get-wmiobject -namespace root\virtualization Msvm_VirtualSystemManagementService
$ListofVMs = get-wmiobject -namespace root\virtualization Msvm_ComputerSystem -filter  "ElementName = 'Vmtest'"    
 
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("$destTemp\TmpDir\$VMName" ))
 {
  [IO.Directory]::Delete("$destTemp\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", "$destTemp\$VMName-OldTmpDir" )
  [IO.Directory]::Move("$destTemp\TmpDir\$VMName", "$dest\$VMName" )
  [IO.Directory]::Delete("$dest\$VMName-OldTmpDir", $True)
 }
 else
 {
  [IO.Directory]::Move("$destTemp\TmpDir\$VMName", "$dest\$VMName" )
 
 
_______________________________________________
 
 
 
J'aie ce message d'erreur...
 
 
[#E2FF00][#E2FF00][#FF0E00]Exception lors de l'appel de « Move » avec « 2 » argument(s) : « Le chemin d'accès source et celui de destination doivent avoir des racines identiques. Le déplacement n'est pas possible entre ces volumes. »
Au niveau de C:\Scripts\Sart_Backup.ps1 : 67 Caractère : 30
+             [IO.Directory]::Move <<<< ("$destTemp\TmpDir\$VMName", "$dest\$VMName" )
    + CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
    + FullyQualifiedErrorId : DotNetMethodException
[/#E2FF00][/#E2FF00][/#FF0E00]
 
 
 

Reply

Marsh Posté le 19-02-2014 à 15:12:51    

c'est normal, un move entre 2 partitions (ou 2 stockages différents) n'est pas un move mais un copie + delete pour des raisons assez logique de reprise sur erreur.
Un move étant juste une "réassignation" de localisation de fichiers dans la la partition.

Reply

Marsh Posté le 20-02-2014 à 10:01:19    

Ok merci pour l'info  :pt1cable:  
 
Je suis passer comme tu m'a conseiller par un autre mode de transfert des sauvegardes.
 
Et sa marche :hello:  
 
 
 
 ##
## Create a backup of all the vm's
##
 
$cheminlog="C:\scripts"  
$datejour=get-date -uformat "%Y-%m-%d"  
$fichierlog=$cheminlog+"\sauv_log_"+$datejour+".log"  
#==========================================================================  
# SETTING  : Démarrage du log  
#==========================================================================  
Start-Transcript -path $fichierlog
 
$dest = "vers nouveau partage"
$destTemp = "temp local"  
$VM_Service = get-wmiobject -namespace root\virtualization Msvm_VirtualSystemManagementService
$ListofVMs = get-wmiobject -namespace root\virtualization Msvm_ComputerSystem -filter  "ElementName <> Name and ElementName = 'Vmtest'"
 
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("$destTemp\TmpDir\$VMName" ))
 {
  [IO.Directory]::Delete("$destTemp\TmpDir\$VMName", $True)
 }
 
 #echo "Exporting the VM"
 $status = $VM_Service.ExportVirtualSystem($VM.__PATH, $True, "$destTemp\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" )
  Copy-item "$destTemp\TmpDir\$VMName" -Destination "$dest\$VMName" -recurse
       [IO.Directory]::Delete("$dest\$VMName-OldTmpDir", $True)
        [IO.Directory]::Delete("$destTemp\TmpDir\$VMName", $True)
 }
 else
 {
         Copy-item "$destTemp\TmpDir\$VMName" -Destination "$dest\$VMName" -recurse
            [IO.Directory]::Delete("$destTemp\TmpDir\$VMName", $True)
             
 }
 
 echo "*-*-*-*-*-*  Export de $VMName terminé *-*-*-*-*-*"
 $VM.RequestStateChange($VMReturnState)
}
#==========================================================================  
# SETTING : Arrêt du log  
#==========================================================================  
Stop-Transcript  
 
#==========================================================================  
# SETTINGS ENVOI DU MAIL : Les répertoires à scanner.  
#==========================================================================  
$expediteur = "Hyper-V@mondom.fr"  
$destinataire = "supervision@mondom.fr"  
$serveur = "smtp.mondom.fr"  
$fichier = $fichierlog  
$objet = "sauvegarde des VM" + [System.DateTime]::Now  
$texte = "Result Sauveagrde VM Hyper-V"
   
#==========================================================================  
# SCRIPT ENVOI DU MAIL
#==========================================================================  
$message = new-object System.Net.Mail.MailMessage $expediteur, $destinataire, $objet, $texte
   
$attachment = new-object System.Net.Mail.Attachment $fichier  
$message.Attachments.Add($attachment)  
$client = new-object System.Net.Mail.SmtpClient $serveur  
$client.Credentials = [System.Net.CredentialCache]::DefaultNetworkCredentials  
 
$client.Send($message)  
#==========================================================================  
# FIN DU SCRIPT  
#==========================================================================
 
 
Je poste le script pour 3615kineve


Message édité par an nibal le 20-02-2014 à 10:03:11
Reply

Marsh Posté le 20-02-2014 à 10:23:33    

Tu devrais ajouter des controles d'erreurs parce que là si ta copie plante je sais pas s'il va pas supprimer le fichier quand même

Reply

Marsh Posté le 21-02-2014 à 09:46:15    

Oui sur le fichier log qui est envoyé par mail aucune erreur ne m'est retourne.
 
je me penche sur le problème si tu as des info. :bounce:

Reply

Marsh Posté le 21-02-2014 à 16:44:35    

Tu as sur la plupart des commandes -ErrorVariable qui te permet d'enregistrer dans une variable une erreur générée par ta commande.
 
Tu peux faire dans un premier temps un check de cette variable après chaque passage de commande (pense à la réinitialiser avant ta commande car elle n'est pas effacée par le passage d'une nouvelle commande)
 
Tu as aussi possibilité de faire un try catch, qui effectue une série d'actions sur une erreur.
 
la syntaxe est la suivante
try { <insere ici la commande à tester>}
catch { write-host "Une erreur s'est produite durant la copie!!!! On va tous mourir!"}
 
Tu peux paufiner ton catch en filtrant le type d'erreur rencontrée. PAr exemple, si tu as une division, et que tu mets ton catch comme ca :  
catch [System.DivideByZeroException] {write-host "C'est divisé par 0 :'("}
 
Tu entreras dans le catch uniquement si ton erreur est de type [System.DivideByZeroException]

Reply

Marsh Posté le 24-02-2014 à 09:19:09    

j'explore....
 
je cherche des info sur tous ce qui ta m'as dit.
 
je pense que -errorvariable me plet bien si j'arrive un incrémenter une valeur sur ma boucle qui passe sur tous mes VM avec un if pour vérifier si ma commande et ok ou ko.
 
je fait des recherche sur cet piste.

Reply

Marsh Posté le 24-02-2014 à 09:51:21    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed