A l’occasion de certaines opérations, comme la suppression d’une VM ou son Storage vMotion, il peut rester des répertoires (contenant ou non des fichiers) qui peuvent alors être source de confusion.
Il peut y avoir aussi des répertoires créés manuellement mais qui auraient du disparaître, des VMs qui ont été supprimées de l’inventaire au lieu d’être effacées, etc.
Le but de ce script est de lister tous les répertoires qui ne contiennent aucun fichier actif d’une VM, ainsi que leur contenu.
Par contre, s’il y a des fichiers excédentaires au sein d’un véritable répertoire de VM, comme un vmdk qui aurait été détaché au lieu d’être supprimé, il ne sera pas listé. Cela fera probablement l’objet d’un autre script.
Je n’ai volontairement pas mis d’option pour supprimer les répertoires automatiquement, pour des raisons de sécurité. Le ménage sera à faire manuellement.
Deux variables sont initialisées aux 2 premières lignes.
– $ExclusionList : liste de chaînes de caractères servant à exclure des répertoires.
Il peut exister des répertoires créés par le système, comme « .vSphere-HA » servant comme canal de communication secondaire, ou dans mon cas « ISO » qui contient tous les fichiers ISO disponibles.
– $Datastores : liste des datastores à parcourir.
Elle peut être initialisée par une requête pour parcourir un datastore, les datastores d’un cluster de datastores, ou tous les datastores du vCenter.
$Datastores = Get-Datastore NomDatastore $Datastores = Get-DatastoreCluster NomDatastoreCluster | Get-Datastore | Sort-Object Name $Datastores = Get-Datastore | Sort-Object Name
$ExclusionList = @("] .vSphere-HA/", "] .dvsData/", "] .naa.", "] .eui.", "] scratch/log", "] ISO") $Datastores = Get-Datastore | Sort-Object Name Write-Host "Retreiving VMs files list..." -ForegroundColor White $VMFiles = (Get-View -ViewType VirtualMachine).layoutex.file | Select-Object Name Write-Host "Retreiving Datastores files list..." -ForegroundColor White $DatastoreFolders = @() $FoldersNotLinkedToVM = @() Foreach ($Datastore in $Datastores) { $DatastorePath = "[" + $Datastore.Name + "]" $SearchFilter = New-Object VMware.Vim.HostDatastoreBrowserSearchSpec $DatastoreView = $Datastore | Get-View $DatastoreBrowser = Get-View $DatastoreView.Browser $SearchResult = $DatastoreBrowser.SearchDatastoreSubFolders($DatastorePath, $SearchFilter) Foreach ($Folder in $SearchResult | Where-Object {$_.FolderPath -ne $DatastorePath}) { $DatastoreFolders += $Folder | Select-Object @{Name="Name";Expression={$Folder.FolderPath}}, File } } Write-Host "Comparing files lists..." -ForegroundColor White Write-Host Foreach ($DatastoreFolder in $DatastoreFolders) { If (($VMFiles | Where-Object {$_.Name -Match [Regex]::Escape($DatastoreFolder.Name)} | Measure-Object).Count -eq 0) { $FoldersNotLinkedToVM += $DatastoreFolder | Where-Object {$_.Name -eq (Select-String -InputObject $DatastoreFolder.Name -Pattern $ExclusionList -NotMatch)} } } If (($FoldersNotLinkedToVM | Measure-Object).Count -eq 0) { Write-Host "There is no datastore folder not linked to a Virtual Machine." -ForegroundColor Green } Else { Write-Host "Here are the datastore folders not linked to a Virtual Machine :" -ForegroundColor Red Foreach ($FolderNotLinkedToVM in $FoldersNotLinkedToVM) { Write-Host "-" $FolderNotLinkedToVM.Name -ForegroundColor Yellow $DatastoreFiles = $FolderNotLinkedToVM | Select-Object -ExpandProperty File | Select-Object @{Name="Name";Expression={$_.Path}} Foreach ($DatastoreFile in $DatastoreFiles) { Write-Host "`t" $DatastoreFile.Name } } }