Script: Add ALL VMs from a Datastore to an ESXi Host
Especially useful when there are orphaned VMs that you don’t know about. I really which vCenter would scan datastores and say “hey, you’re not using this VM, but it’s taking space on one of your datastores.” This script will take care of it for you. Almost positive I took this from the Internet at some point, but can’t find the source. Sorry for the lack of reference.
# Traverses all folders of a data store and adds all VMX files to the inventory # # Example: # # .\Add-VMXToInventory.ps1 -DatastoreName My_Datastore -VMFolder VDI -vCenter vcentername -ESXHost host.domain.com #
param ( [Parameter(Mandatory=$true)] [string] $DatastoreName, # Case sensitive [Parameter(Mandatory=$true)] [string] $VMFolder, [Parameter(Mandatory=$true)] [string] $vCenter, [Parameter(Mandatory=$true)] [string] $ESXHost )
# # General options # #Requires -Version 2
Set-StrictMode -Version 2
# # Functions # # Loads snapins function LoadSnapins([string[]] $snapins) { $loaded = Get-PSSnapin -Name $snapins -ErrorAction SilentlyContinue | % {$_.Name} $registered = Get-pssnapin -Name $snapins -Registered -ErrorAction SilentlyContinue | % {$_.Name} $notLoaded = $registered | ? {$loaded -notcontains $_}
if ($notLoaded -ne $null) { foreach ($newlyLoaded in $notLoaded) { Add-PSSnapin $newlyLoaded } } }
# # Start of script # # Load snapins LoadSnapins @("VMware.VimAutomation.Core")
# Avoid stupid questions Set-PowerCLIConfiguration -DefaultVIServerMode multiple -Confirm:$false
# Connect to vCenter Connect-VIServer $vCenter
# Set up search for .VMX files in datastore $ds = Get-Datastore -Name $DatastoreName | %{Get-View $_.Id} $SearchSpec = New-Object VMware.Vim.HostDatastoreBrowserSearchSpec $SearchSpec.matchpattern = "*.vmx" $dsBrowser = Get-View $ds.browser $DatastorePath = "[" + $ds.Summary.Name + "]"
# Find all .VMX file paths in datastore, filtering out ones with .snapshot (useful for NetApp NFS) $SearchResult = $dsBrowser.SearchDatastoreSubFolders($DatastorePath, $SearchSpec) | where {$_.FolderPath -notmatch ".snapshot"} | %{$_.FolderPath + ($_.File | select Path).Path}
#Register all .vmx files as VMs on the datastore foreach($VMXFile in $SearchResult) { New-VM -VMFilePath $VMXFile -VMHost $ESXHost -Location $VMFolder -RunAsync }













