VMware Cloud Community
ganapa2000
Hot Shot
Hot Shot

Orphaned Data not deleting and size of the datastore not getting reduced

Hi,

I am using the below script to identify and delete the Orphaned files on a datastore, when I execute the below script to delete, it deletes the vmdk but I see flat.vmdk file exist in the datastore and after deletion, size of the datastore is not getting reduced.

Please help

function Get-VmwOrphan{

[CmdletBinding(SupportsShouldProcess=$True)]
param(
[parameter(Mandatory=$true,ValueFromPipeline=$true)]
[PSObject[]]$Datastore,
[String[]]$ExcludeFolder,
[Switch]$Delete
)

Begin{
$flags = New-Object VMware.Vim.FileQueryFlags
$flags.FileOwner = $true
$flags.FileSize = $true
$flags.FileType = $true
$flags.Modification = $true

$qFloppy = New-Object VMware.Vim.FloppyImageFileQuery
$qFolder = New-Object VMware.Vim.FolderFileQuery
$qISO = New-Object VMware.Vim.IsoImageFileQuery
$qConfig = New-Object VMware.Vim.VmConfigFileQuery
$qConfig.Details = New-Object VMware.Vim.VmConfigFileQueryFlags
$qConfig.Details.ConfigVersion = $true
$qTemplate = New-Object VMware.Vim.TemplateConfigFileQuery
$qTemplate.Details = New-Object VMware.Vim.VmConfigFileQueryFlags
$qTemplate.Details.ConfigVersion = $true
$qDisk = New-Object VMware.Vim.VmDiskFileQuery
$qDisk.Details = New-Object VMware.Vim.VmDiskFileQueryFlags
$qDisk.Details.CapacityKB = $true
$qDisk.Details.DiskExtents = $true
$qDisk.Details.DiskType = $true
$qDisk.Details.HardwareVersion = $true
$qDisk.Details.Thin = $true
$qLog = New-Object VMware.Vim.VmLogFileQuery
$qRAM = New-Object VMware.Vim.VmNvramFileQuery
$qSnap = New-Object VMware.Vim.VmSnapshotFileQuery

$searchSpec = New-Object VMware.Vim.HostDatastoreBrowserSearchSpec
$searchSpec.details = $flags
$searchSpec.Query = $qFloppy,$qFolder,$qISO,$qConfig,$qTemplate,$qDisk,$qLog,$qRAM,$qSnap
$searchSpec.sortFoldersFirst = $true

$fileMgr = Get-View FileManager
$excludeFilter = $ExcludeFolder -join '|'
}

Process{
foreach($ds in $Datastore){
if($ds.GetType().Name -eq "String"){
$ds = Get-Datastore -Name $ds
}

# Only shared VMFS datastore
if($ds.Type -eq "VMFS" -and $ds.Accessible){
Write-Verbose -Message "$(Get-Date)`t$((Get-PSCallStack)[0].Command)`tLooking at $($ds.Name)"

# Define file DB
$fileTab = @{}

# Get datastore files
$dsBrowser = Get-View -Id $ds.ExtensionData.browser
$rootPath = "[" + $ds.Name + "]"
$searchResult = $dsBrowser.SearchDatastoreSubFolders($rootPath, $searchSpec) | Sort-Object -Property {$_.FolderPath.Length}
foreach($folder in $searchResult){
foreach ($file in $folder.File){
$filler = ''
if($folder.FolderPath[-1] -eq ']'){$filler = ' '}
elseif($folder.FolderPath[-1] -ne '/'){$filler = '/'}
$key = "$($folder.FolderPath)$filler$($file.Path)"
#if($key -notmatch $excludeFilter){
if($excludeFilter -eq '' -or ($excludeFilter -ne '' -and $key -notmatch $excludeFilter)){
$fileTab.Add($key,$file)

$folderKey = "$($folder.FolderPath.TrimEnd('/'))"
if($fileTab.ContainsKey($folderKey)){
$fileTab.Remove($folderKey)
}
}
else{
Write-Verbose -Message "$(Get-Date)`t$((Get-PSCallStack)[0].Command)`tExcluding $key"
}
}
}

# Get VM inventory
Get-VM -Datastore $ds | %{
$_.ExtensionData.LayoutEx.File | %{
if($fileTab.ContainsKey($_.Name)){
$fileTab.Remove($_.Name)
}
}
}

# Get Template inventory
Get-Template | where {$_.DatastoreIdList -contains $ds.Id} | %{
$_.ExtensionData.LayoutEx.File | %{
if($fileTab.ContainsKey($_.Name)){
$fileTab.Remove($_.Name)
}
}
if($fileTab.ContainsKey($_.ExtensionData.Config.Files.VmPathName)){
$fileTab.Remove($_.ExtensionData.Config.Files.VmPathName)
}
}

# Remove system files & folders from list
$systemFiles = $fileTab.Keys | where{$_ -match "] \.|vmkdump"}
$systemFiles | %{
$fileTab.Remove($_)
}

# Organise remaining files
if($fileTab.Count){
$fileTab.GetEnumerator() | %{
$obj = [ordered]@{
Datastore = $ds.Name
Name = $_.Value.Path
Path = $_.Name
#VMDK = $_.Name.Split('/')[1].TrimStart('[')
Size = $_.Value.FileSize
CapacityKB = [math]::Round($_.Value.FileSize/1024,0)
CapacityMB = [math]::Round($_.Value.FileSize/1024/1024,0)
CapacityGB = [math]::Round($_.Value.FileSize/1024/1024/1024,0)
Modification = $_.Value.Modification
Owner = $_.Value.Owner
Thin = $_.Value.Thin
Extents = $_.Value.DiskExtents -join ','
DiskType = $_.Value.DiskType
HWVersion = $_.Value.HardwareVersion
}
New-Object PSObject -Property $obj
if($Delete){
If ($PSCmdlet.ShouldProcess($_.Name,"Remove Folder/File")){
$fileMgr.DeleteDatastoreFile($_.Name,$ds.Datacenter.ExtensionData.MoRef)
}
}
}
Write-Verbose -Message "$(Get-Date)`t$((Get-PSCallStack)[0].Command)`tFound orphaned files on $($ds.Name)!"
}
else{
Write-Verbose -Message "$(Get-Date)`t$((Get-PSCallStack)[0].Command)`tNo orphaned files found on $($ds.Name)."
}
}
}
}
}


Get-Datastore -Name "5200_DS26" | Get-VmwOrphan -Delete -Verbose

 

0 Kudos
1 Reply
LucD
Leadership
Leadership

That is a known issue I'm afraid.

Try replacing this part

            if ($Delete) {
              If ($PSCmdlet.ShouldProcess($_.Name, "Remove Folder/File")) {
                $fileMgr.DeleteDatastoreFile($_.Name, $ds.Datacenter.ExtensionData.MoRef)
              }
            }



with

            if ($Delete) {
              If ($PSCmdlet.ShouldProcess($_.Name, "Remove Folder/File")) {
                $fileMgr.DeleteDatastoreFile($_.Name, $ds.Datacenter.ExtensionData.MoRef)
                if ($_.Value.DiskExtents.Count -ne 0) {
                  $_.Value.DiskExtents | ForEach-Object -Process {
                    $fileMgr.DeleteDatastoreFile($_, $ds.Datacenter.ExtensionData.MoRef)
                  }
                }
              }
            }

 


Blog: lucd.info  Twitter: @LucD22  Co-author PowerCLI Reference

0 Kudos