Finding stuff in all the cool datastores you never knew you had (or that you knew you had, you just really didn’t want to click alot)

Lucd has been my number one source of scripts for pretty much like ever. He is always willing to helping out in the community, uber smart and knows his stuff. I often will use his scripts to start and do something else with them, mostly because I don’t know how, and I am lazy. his most awesome script was something that i started to do, and did back in bash in the good ol esx days, since esx pretty much is dead (it’s about freaking time), i needed to convert it PS to make it work, but low and behold, he already did it.

Here. Raiders of the lost VMX

These things are amazing for scripting DR when the client just isn’t big enough to justify SRM

Anywho how this started is I recently had a client’s site the VDR appliance blow up and start making snapshot files with failing the snapshot, since it failed it never removed the vmsn files, and it was only on a few particular datastores. I am not gonna name names, but I’m 99% sure it had to do with the buggy 5.0.1 equallogic firmware and its Atomic Lock and Set, but now that that is fixed its pretty freaking awesome.
so with the permission of LucD himself, here is the modified script to look for vmsn files plus all the other cool stuff it could do beforehand!

without more delay, here it is!
function Register-VMX {
param($entityName = $null,$dsNames = $null,$template = $false,$ignore = $null,$checkNFS = $false,$whatif=$false,$snapshot = $false)

function Get-Usage{
Write-Host "Parameters incorrect" -ForegroundColor red
Write-Host "Register-VMX -entityName -dsNames [,…]"
Write-Host "entityName : a cluster-, datacenter or ESX hostname"
Write-Host "dsNames : one or more datastorename names"
Write-Host "ignore : names of folders that shouldn’t be checked"
Write-Host "template : register guests ($false)or templates ($true) – default : $false"
Write-Host "checkNFS : include NFS datastores – default : $false"
Write-Host "whatif : when $true will only list and not execute – default : $false"
Write-Host "snapshot : finds vmsn files if set to ($true) – default : $false"

if($entityName -ne $null -and $dsNames -ne $null){

if($dsNames -eq $null){
switch((Get-Inventory -Name $entityName).GetType().Name.Replace("Wrapper","")){
$dsNames = Get-Cluster -Name $entityName | Get-VMHost | Get-Datastore | where {$_.Type -eq "VMFS" -or $checkNFS} | % {$_.Name}
$dsNames = Get-Datacenter -Name $entityName | Get-Datastore | where {$_.Type -eq "VMFS" -or $checkNFS} | % {$_.Name}
$dsNames = Get-VMHost -Name $entityName | Get-Datastore | where {$_.Type -eq "VMFS" -or $checkNFS} | % {$_.Name}
$dsNames = Get-Datastore -Name $dsNames | where {$_.Type -eq "VMFS" -or $checkNFS} | % {$_.Name}

$dsNames = $dsNames | Sort-Object
$pattern = "*.vmx"
$pattern = "*.vmtx"
$pattern = "*.vmsn"

foreach($dsName in $dsNames){
Write-Host "Checking " -NoNewline; Write-Host -ForegroundColor red -BackgroundColor yellow $dsName
$ds = Get-Datastore $dsName | Get-View
$dsBrowser = Get-View $ds.Browser
$dc = Get-View $ds.Parent
while($dc.MoRef.Type -ne "Datacenter"){
$dc = Get-View $dc.Parent
$tgtfolder = Get-View $dc.VmFolder
$esx = Get-View $ds.Host[0].Key
$pool = Get-View (Get-View $esx.Parent).ResourcePool

$vms = @()
foreach($vmImpl in $ds.Vm){
$vm = Get-View $vmImpl
$vms += $vm.Config.Files.VmPathName
$datastorepath = "[" + $ds.Name + "]"

$searchspec = New-Object VMware.Vim.HostDatastoreBrowserSearchSpec
$searchspec.MatchPattern = $pattern

$taskMoRef = $dsBrowser.SearchDatastoreSubFolders_Task($datastorePath, $searchSpec)

$task = Get-View $taskMoRef
while ("running","queued" -contains $task.Info.State){
foreach ($folder in $task.Info.Result){
if(!($ignore -and (&{$res = $false; $folder.FolderPath.Split("]")[1].Trim(" /").Split("/") | %{$res = $res -or ($ignore -contains $_)}; $res}))){
$found = $FALSE
if($folder.file -ne $null){
foreach($vmx in $vms){
if(($folder.FolderPath + $folder.File[0].Path) -eq $vmx){
$found = $TRUE
if (-not $found){
if($folder.FolderPath[-1] -ne "/"){$folder.FolderPath += "/"}
$vmx = $folder.FolderPath + $folder.File[0].Path
Write-Host "`t" $vmx
write-host " Snapshot file found" -ForegroundColor blue -BackgroundColor white
$params = @($vmx,$null,$true,$null,$esx.MoRef)
$params = @($vmx,$null,$false,$pool.MoRef,$null)
if((!$whatif) -and (!$snapshot)){
$taskMoRef = $tgtfolder.GetType().GetMethod("RegisterVM_Task").Invoke($tgtfolder, $params)
Write-Host "`t" $vmx "registered"
Write-Host "`t" $vmx "registered" -NoNewline; Write-Host -ForegroundColor blue -BackgroundColor white " ==> What If"
Write-Host "Done"

# Register-VMX -entityName "MyDatacenter" -snapshot:$true
# Register-VMX -entityName "MyDatacenter"
# Register-VMX -dsNames "datastore1","datastore2"
# Register-VMX -dsNames "datastore1","datastore2" -template:$true
# Register-VMX -entityName "MyDatacenter" -ignore "SomeFolder"
# Register-VMX -dsNames "datastore3","datastore4" -ignore "SomeFolder" -checkNFS:$true
# Register-VMX -entityName "MyDatacenter" -whatif:$true

Leave a Reply

Your email address will not be published.