Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1818 connectés 

  FORUM HardWare.fr
  Systèmes & Réseaux Pro
  Infrastructures serveurs

  Probléme Script Powershell 2.0 Sauvegarde Hyper-v

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Probléme Script Powershell 2.0 Sauvegarde Hyper-v

n°118639
an nibal
Posté le 18-02-2014 à 17:36:11  profilanswer
 

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.

mood
Publicité
Posté le 18-02-2014 à 17:36:11  profilanswer
 

n°118680
an nibal
Posté le 19-02-2014 à 14:48:16  profilanswer
 

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]
 
 
 

n°118681
Je@nb
Modérateur
Kindly give dime
Posté le 19-02-2014 à 15:12:51  profilanswer
 

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.

n°118712
an nibal
Posté le 20-02-2014 à 10:01:19  profilanswer
 

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
n°118718
Je@nb
Modérateur
Kindly give dime
Posté le 20-02-2014 à 10:23:33  profilanswer
 

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

n°118759
an nibal
Posté le 21-02-2014 à 09:46:15  profilanswer
 

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:

n°118780
D@rum
Parce que je le vaut bien
Posté le 21-02-2014 à 16:44:35  profilanswer
 

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]

n°118845
an nibal
Posté le 24-02-2014 à 09:19:09  profilanswer
 

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.

n°118849
an nibal
Posté le 24-02-2014 à 09:51:21  profilanswer
 

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Systèmes & Réseaux Pro
  Infrastructures serveurs

  Probléme Script Powershell 2.0 Sauvegarde Hyper-v

 

Sujets relatifs
problême fonts WindowsProblème de serveur
Problème sur TwitchPlantage sauvegarde System Recovery 2011
probleme sur Netasq U70Problème de mx et nom de domaine namebay pour exchange
WDS TFTP problème[RESOLU] script de modification des stratégies locales
PC routeur avec 2 cartes ethernet, problème de ping distant 
Plus de sujets relatifs à : Probléme Script Powershell 2.0 Sauvegarde Hyper-v


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR