VMware Cloud Community
jsb10221
Contributor
Contributor

PowerShell script error....

Hello,

I found a script I want to use and of course since Im new to PowerShell, I get an error that the "Connect-VIServer" is not recognized as the name of a cmdlet. So basically Powershell does not recognzie line 12. Is there something I need to do to make PowerShell recognize that cmdlet?

Any help is greatly appreciated...

#Get VMware Disk Usage

  1. Created by Hugo Peeters

  2. http://www.peetersonline.nl

  1. VARIABLES

$Decimals = 1

$VCServer = “MYVCSERVER”

  1. SCRIPT

  2. Connect to VC

Write-Progress “Gathering Information” “Connecting to Virtual Center” -Id 0

$VC = Connect-VIServer $VCServer

  1. Create Output Collection

$myCol = @()

  1. List Datastores (Datastore Name)

Write-Progress “Gathering Information” “Listing Datastores” -Id 0

$Datastores = Get-Datastore | Sort Name

  1. List vms

Write-Progress “Gathering Information” “Listing VMs and Disk Files” -Id 0

$VMSummaries = @()

ForEach ($vm in (Get-VM))

{

$VMView = $VM | Get-View

ForEach ($VirtualSCSIController in ($VMView.Config.Hardware.Device | Where {$_.DeviceInfo.Label -match “SCSI Controller”}))

{

ForEach ($VirtualDiskDevice in ($VMView.Config.Hardware.Device | Where {$_.ControllerKey -eq $VirtualSCSIController.Key}))

{

$VMSummary = “” | Select VM, HostName, PowerState, DiskFile, DiskName, DiskSize, SCSIController, SCSITarget

$VMSummary.VM = $VM.Name

$VMSummary.HostName = $VMView.Guest.HostName

$VMSummary.PowerState = $VM.PowerState

$VMSummary.DiskFile = $VirtualDiskDevice.Backing.FileName

$VMSummary.DiskName = $VirtualDiskDevice.DeviceInfo.Label

$VMSummary.DiskSize = $VirtualDiskDevice.CapacityInKB * 1KB

$VMSummary.SCSIController = $VirtualSCSIController.BusNumber

$VMSummary.SCSITarget = $VirtualDiskDevice.UnitNumber

$VMSummaries += $VMSummary

}

}

Clear-Variable VMView -ErrorAction SilentlyContinue

}

  1. Loop through Datastores

ForEach ($Datastore in $Datastores)

{

  1. List vmdk files in datastore (vmdk Name)

Write-Progress “Gathering Information” (“Processing Datastore {0}” -f $Datastore.Name) -Id 0

$DSView = $Datastore | Get-View

$fileQueryFlags = New-Object VMware.Vim.FileQueryFlags

$fileQueryFlags.FileSize = $true

$fileQueryFlags.FileType = $true

$fileQueryFlags.Modification = $true

$searchSpec = New-Object VMware.Vim.HostDatastoreBrowserSearchSpec

$searchSpec.details = $fileQueryFlags

$searchSpec.sortFoldersFirst = $true

$dsBrowser = Get-View $DSView.browser

$rootPath = ““

$searchResult = $dsBrowser.SearchDatastoreSubFolders($rootPath, $searchSpec)

ForEach ($result in $searchResult)

{

ForEach ($vmdk in ($result.File | ?{$_.Path -like “*.vmdk”} | Sort Path))

{

Write-Progress “Gathering Information” (“Processing VMDK {0}” -f $vmdk.Path) -Id 1

Write-Host “==============================================================================”

  1. Find vm using the vmdk (VM Name)

$VMRef = ($VMSummaries | ?{$_.DiskFile -match $Datastore.Name -and $_.DiskFile -match $vmdk.Path})

“VMDK belongs to VM

  1. Match disk based on SCSI ID’s
  2. Find the Partition(s) on this disk
  3. Create Output Object
  4. List datastore name
  5. Determine datastore size in GB
” -f $vmdk.Path, $VMRef.VM If ($VMRef.Powerstate -eq “PoweredOn”) { Write-Host “VM is powered on” -ForegroundColor “yellow” $Partitions = Get-WmiObject -Class Win32_DiskPartition -ComputerName $VMRef.HostName If ($?) { $Disks = Get-WmiObject -Class Win32_DiskDrive -ComputerName $VMRef.HostName $LogicalDisks = Get-WmiObject -Class Win32_LogicalDisk -ComputerName $VMRef.HostName $DiskToPartition = Get-WmiObject -Class Win32_DiskDriveToDiskPartition -ComputerName $VMRef.HostName $LogicalDiskToPartition = Get-WmiObject -Class Win32_LogicalDiskToPartition -ComputerName $VMRef.HostName Write-Host “Read partition and disk information” -ForegroundColor “yellow”
  1. Determine datastore free space (DS%Free)
$DiskMatch = $Disks | ?{($_.SCSIPort – 1) -eq $VMRef.SCSIController -and $_.SCSITargetID -eq $VMRef.SCSITarget} If ($DiskMatch -eq $null){Write-Warning “NO MATCHES!”} Else { Write-Host “Found match:” -ForegroundColor “yellow” $DiskMatch
  1. List disk file name
  2. List VM Name
  3. Determine virtual hard disk / logical drive
  4. Report driveletter
  5. Report Size
$PartitionsOnDisk = ($DiskToPartition | ?{$_.Antecedent -eq $DiskMatch.__PATH}) If ($PartitionsOnDisk -eq $null){Write-Warning “NO PARTITIONS!”} Else { ForEach ($PartitionOnDisk in $PartitionsOnDisk) { Write-Host “Disk contains partition” -ForegroundColor “yellow” $PartitionOnDisk.Dependent $PartitionMatches = $Partitions | ?{$_.__PATH -eq $PartitionOnDisk.Dependent} ForEach ($PartitionMatch in $PartitionMatches) { $LogicalDiskRefs = $LogicalDiskToPartition | ?{$_.Antecedent -eq $PartitionMatch.__PATH} If ($LogicalDiskRefs -eq $null) { Write-Warning “NO LOGICAL DISKS!” } Else { ForEach ($LogicalDiskRef in $LogicalDiskRefs) { $LogicalDiskMatches = $LogicalDisks | ?{$_.__PATH -eq $LogicalDiskRef.Dependent} ForEach ($LogicalDiskMatch in $LogicalDiskMatches) { Write-Host “Matching Logical Disk:” -ForegroundColor “yellow” $LogicalDiskMatch
  1. Report Free Space
$myObj = “” | Select Datastore, DSSizeGB, DSFreeGB, DSPercentFree, DiskFile, VM, HardDisk, DriveLetter, DiskSizeGB, DiskFreeGB, PercFree
  1. Calculate Percentage free space
$myObj.Datastore = $Datastore.Name $myObj.DSSizeGB =
  1. Add output object to output collection
::Round(($Datastore.CapacityMB * 1MB / 1GB),$Decimals) $myObj.DSFreeGB = ::Round(($Datastore.FreeSpaceMB * 1MB / 1GB),$Decimals) $myObj.DSPercentFree = ::Round((100*($Datastore.FreeSpaceMB/$Datastore.CapacityMB)),$Decimals) $myObj.DiskFile = $vmdk.Path $myObj.VM = $VMRef.VM $myObj.HardDisk = $VMRef.DiskName $myObj.DriveLetter = $LogicalDiskMatch.DeviceID $myObj.DiskSizeGB = ::Round(($LogicalDiskMatch.Size / 1GB),$Decimals) $myObj.DiskFreeGB = ::Round(($LogicalDiskMatch.FreeSpace / 1GB),$Decimals) $myObj.PercFree = ::Round((100 * (($LogicalDiskMatch.FreeSpace / 1MB) / ($LogicalDiskMatch.Size / 1MB))),$Decimals) Write-Host “RESULT:” -ForegroundColor “yellow” $myObj $myCol += $myObj } Clear-Variable LogicalDiskMatches -ErrorAction SilentlyContinue } } Clear-Variable LogicalDiskRefs -ErrorAction SilentlyContinue } Clear-Variable PartitionMatches -ErrorAction SilentlyContinue } } Clear-Variable PartitionsOnDisk -ErrorAction SilentlyContinue } Clear-Variable DiskMatch -ErrorAction SilentlyContinue Clear-Variable Disks -ErrorAction SilentlyContinue Clear-Variable LogicalDisks -ErrorAction SilentlyContinue Clear-Variable DiskToPartition -ErrorAction SilentlyContinue Clear-Variable LogicalDiskToPartition -ErrorAction SilentlyContinue } Clear-Variable Partitions -ErrorAction SilentlyContinue } Else { Write-Host “VM is powered off” -ForegroundColor “yellow” } Clear-Variable VMRef -ErrorAction SilentlyContinue Write-Progress “Gathering Information” (“Processing VMDK ” -f $vmdk.Path) -Id 1 -Completed

}

}

}

  1. Disconnect from VC

Disconnect-VIServer -Confirm:$False

  1. OUTPUT

Write-Host “===================================================”

Write-Host “===================================================”

$TotalDSFree = ($myCol | Select Datastore, DSFreeGB -Unique | Measure-Object DSFreeGB -Sum).Sum

$TotalDSSize = ($myCol | Select Datastore, DSSizeGB -Unique | Measure-Object DSSizeGB -Sum).Sum

$AverageDSFree = ::Round(100 * ($TotalDSFree / $TotalDSSize),$Decimals)

$AverageDiskFree = ::Round(100 * (($myCol | Measure-Object DiskFreeGB -Sum).Sum / ($myCol | Measure-Object DiskSizeGB -Sum).Sum),$Decimals)

Write-Host “Total DS Free: $TotalDSFree”

Write-Host “Total DS Size: $TotalDSSize”

Write-Host “Average DS Free Percentage: $AverageDSFree”

Write-Host “Average Disk Free Percentage: $AverageDiskFree”

$myCol | Export-Csv -NoTypeInformation ‘P:\#TEMP\VMwareDiskUsage.csv’

Thanks.

0 Kudos
2 Replies
Troy_Clavell
Immortal
Immortal

you need VMware vSphere™ PowerCLI along with PowerShell,which will have all the proper cmdlets

http://communities.vmware.com/docs/DOC-11607

0 Kudos
timparkinsonShe
Enthusiast
Enthusiast

If you already have PowerCLI and you are not running the script from within the powercli prompt (i.e. you're running through vanilla powershell) then add the following lines to the very top of the script to load the VMware bits and pieces:

Add-PSSnapin -Name "VMware.VimAutomation.Core"

http://Reflection.Assembly::LoadWithPartialName("vmware.vim")

0 Kudos