PS PowerCLI-helper-v1.1.ps1

From vwiki
Jump to navigation Jump to search
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.

This is adapted from other examples found on the internet - original source forgotten, apologies.

# ============================================================================
# PowerCLI Helper Functions Library
# ============================================================================
# Simon Strutt        Nov 2010
# ============================================================================
#
# Version 1
# - Initial Creation
#
# Version 1.1 - Nov 2010
# - Get-FolderPath Bugfix: Regex now handles foldernames with "vm" in
# - Get-FolderPath Added : Max iteration depth
#
# TO DO
# - Get-FolderPath limitations
#
# =============================================================================


#=======================================================
# Get-FolderPath ($CurrFolder)
#
# Returns full VM path, given its containing folder ID
#
# Limitations...
# - Doesn't handle ' chars
# - Doesn't handle foldernames with "vm" in
# 
#=======================================================
function Get-FolderPath ($CurrFolder) {
    $path = ""
    $i = 0
    While ($CurrFolder.Name -notmatch "\bvm\b") {
        $path = ($CurrFolder.Name) + "\" + $path
        $CurrFolder = Get-Folder -Id $CurrFolder.ParentId
        $i ++
        if ($i > 15) {
            Log("ERROR: Get-FolderPath ($CurrFolder) exceeded maximum iteration depth")
            $path = "...\" + $path
            break
        }    
    }
    $path
}

#========================================================
# Get-VMDiskUsage($vm2do)
#
# Returns total datastore usage for a VM in GB
#
# Limitations...
# - Doesn't handle Lab Manager VM's well
# 
#=========================================================

function Get-VMDiskUsage($vm2do)
{
    #Initialize variables
    $VMDirs =@()
    $VMSize = 0
 
    $searchSpec = New-Object VMware.Vim.HostDatastoreBrowserSearchSpec
    $searchSpec.details = New-Object VMware.Vim.FileQueryFlags
    $searchSpec.details.fileSize = $TRUE
 
    Get-View -VIObject $vm2do | % {
        #Create an array with the vm's directories
        $VMDirs += $_.Config.Files.VmPathName.split("/")[0]
        $VMDirs += $_.Config.Files.SnapshotDirectory.split("/")[0]
        $VMDirs += $_.Config.Files.SuspendDirectory.split("/")[0]
        $VMDirs += $_.Config.Files.LogDirectory.split("/")[0]
        #Add directories of the vm's virtual disk files
        foreach ($disk in $_.Layout.Disk) {
            foreach ($diskfile in $disk.diskfile){
                $VMDirs += $diskfile.split("/")[0]
            }
        }
        #Only take unique array items
        $VMDirs = $VMDirs | Sort | Get-Unique
 
        foreach ($dir in $VMDirs){
            $ds = Get-Datastore ($dir.split("[")[1]).split("]")[0]
            $dsb = Get-View (($ds | get-view).Browser)
            $taskMoRef  = $dsb.SearchDatastoreSubFolders_Task($dir,$searchSpec)
            $task = Get-View $taskMoRef 
 
            while($task.Info.State -eq "running" -or $task.Info.State -eq "queued"){$task = Get-View $taskMoRef }
            foreach ($result in $task.Info.Result){
                foreach ($file in $result.File){
                    $VMSize += $file.FileSize
                }
            }
        }
    }
 
    # VM disk usage in GB
    $VMSize/1048576000
}


#========================================================
# Get-VMDKDatastores($vm2do)
#
# Returns VMDK datastores and sizes used by a VM (in a hash table)
#
# Limitations...
# - 
# 
#=========================================================

function Get-VMDKDatastores($vm2do)
{
    $VMDKs = Get-VM $vm2do | Get-HardDisk
    $vmdk =@{}
    for ($i=0; $i -le $VMDKs.Length-1; $i++) {
        # Convert path to datasore
        $ds = ([regex]::matches($VMDKs[$i].Filename, "(?<=\[)(.*?)(?=\])")).Item(0).Value
        $ds.Value
        if ($vmdk.ContainsKey($ds)) {
            $vmdk.($ds, $vmdk[$ds] + $VMDKs[$i].CapacityKB)
        } else {
            $vmdk.Add($ds, $VMDKs[$i].CapacityKB)
        }
    }
    $vmdk
}