Clear-Host $VIserver = "NomvCenter" $VILogin = "domaine\loginvCenter" $VIMotdepasse = "MotDePassevCenter" #Definition des variables globales $global:varNomVM = "" $global:varVMLogin = "" $global:varVMMotdepasse = "" $global:varNomSnapshot = "" function main() { asnp vmware* #Import modules VMWares $ErrorActionPreference = "Continue" if ($verbose) {$VerbosePreference = "Continue"} if ($debug) {$DebugPreference = "Continue"} $DebugPreference = "SilentlyContinue" CheckVIToolKit Connect-VIServer -Server $VIserver -User $VILogin -Password $VIMotdepasse Write-Host "Traitement de $varNomVM" $UneVM = Get-VM -Name $varNomVM Write-Host $UneVM.PowerState #Juste pour afficher si la VM est allumée ou non $Error.Clear() Write-Host "Traitement de $varNomVM" $UneVM = Get-VM -Name $UneLigne $toolsstatus = $vmview.Guest.ToolsStatus Write-Host "$varNomVM : Tools status : $toolsstatus" Write-Host $UneVM.PowerState if ($UneVM.PowerState -eq "PoweredOn") { Write-Host "Shutdown guest de $varNomVM" Shutdown-VMGuest -VM $UneVM -Confirm:$false } while ($UneVM.PowerState -eq "PoweredOn") { sleep 4 $UneVM = Get-VM -Name $varNomVM #On est obligé de refaire un Get-VM sur la machine pour avoir un statut de PowerState à jour. C'est très con. Write-Host $UneVM.PowerState } Write-Host "$varNomVM est bien arrêté" Write-Host "$varNomVM : Création d'un snapshot" New-Snapshot -Name $varNomSnapshot -Description $varNomSnapshot -VM $UneVM #-RunAsync Write-Host "$varNomVM : Démarrage de la VM $varNomVM" Start-VM -VM $UneVM while ($UneVM.PowerState -ne "PoweredOn") { Write-Host "La Vm $varNomVM n'est pas encore allumée. Attente de 4 secondes" sleep 4 $UneVM = Get-VM -Name $varNomVM #On est obligé de refaire un Get-VM sur la machine pour avoir un statut de PowerState à jour. C'est très con. Write-Host $UneVM.PowerState } #Attente tant que l'on n'arrive pas à contacter les VMTools write-host "Attente de la disponibilité des VMTools" do { $toolsStatus = (Get-VM $UneVM | Get-View).Guest.ToolsStatus write-host $toolsStatus sleep 3 } until ( ($toolsStatus -eq ‘toolsOk’) -or ($toolsStatus -eq ‘toolsOld’)) Write-Host "Tools de $varNomVM Ok" # #Attente de la possibilité du lancement d'une commande auprès des VMTools # write-host "Test de lancement d'une commande via les VMTools" # write-host "Ce test echoue a chaque fois si le login et mdp est faux donc attention" # do { # sleep 10 # $Error.Clear() # $Mycommand = "dir.exe" # Invoke-VMScript -ScriptText $Mycommand -VM $UneVM -ScriptType Bat -GuestUser $varVMLogin -GuestPassword $varVMMotdepasse # $varErrorCount = [string]$($Error.Count) # write-host "Error count : $($Error.Count)" # write-host "varErrorCount : $varErrorCount" # } while ($varErrorCount -ne "0") # write-host "$varNomVM est maintenant allumee et les VMTools peuvent executer une commande" Write-Host "Mise à jour des VMTools" #Monter une ISO sur le CD $DatastoreName = "[031-SVC-P315]" $isopath = "_ISO/VMTOOLS_55U2/VMware-tools-windows-9.4.10-2092844.iso" $FullIsoPath = "$DatastoreName $isopath" $MyCd = get-cddrive -VM $UneVM | set-cddrive -IsoPath $FullIsoPath -Connected $true -Confirm:$false $DriveLetter = "D:" $ScriptText = "$DriveLetter\setup64.exe /S /v `"/qn REBOOT=R ADDLOCAL=ALL REMOVE=Hgfs,WYSE`"" Invoke-VMScript -VM $UneVM -ScriptText $ScriptText -ScriptType bat -GuestUser $VMLogin -GuestPassword $VMMotdepasse #Démonter l'ISO Set-CDDrive -CD $MyCd -NoMedia -Confirm:$false #Disconnect the ISO sleep 10 } function CheckVIToolKit() { ## Before we do anything we must check to see if the user has the VI toolkit installed. ## If user does not then we prompt the user and exit. $Error.Clear() Get-PSSnapin vmware* if($Error.Count -ne 0) { Clear-Host Write-Host "`n`n`t`t ERROR - To run this script, the VI Toolkit must be installed and registered with Powershell. If the VI Tollkit is installed," -foregroundcolor red -backgroundColor yellow Write-Host "`t`t go to the Settings menu in Powershell Plus and click on Manage Snapins." -foregroundcolor red -backgroundColor yellow # Read-Host "`n`n`t Press to continue." break } }## EOF: CheckVIToolKit() Function ParseCommand($oArgs){ #Parses the command line and fills the script variables #with the appropriate values. # $test = "-n,test" # $oArgs = $test.split(",") $ArgCount = 0 if (!$oArgs.length -gt 0){ write-host "No arguments specified." } While ($ArgCount -lt $oArgs.length){ switch ($oArgs[$ArgCount].ToLower()){ "-v"{ $global:varNomVM = $oArgs[($ArgCount+1)] $ArgCount = ($ArgCount + 2) write-host "-v : $varNomVM" break } "-loginvm"{ $global:varVMLogin = $oArgs[($ArgCount+1)] $ArgCount = ($ArgCount + 2) write-host "-loginvm : $varVMLogin" break } "-mdpvm"{ $global:varVMMotdepasse = $oArgs[($ArgCount+1)] $ArgCount = ($ArgCount + 2) write-host "-mdpvm : $varVMMotdepasse" break } "-nomsnap"{ $global:varNomSnapshot = $oArgs[($ArgCount+1)] $ArgCount = ($ArgCount + 2) write-host "-nomsnap : $varNomSnapshot" break } default{ write-host "Invalid command." # Help exit } } } } #Parse commands ParseCommand($args) ## Run Main main