Die Zeile "ForEach ($VM in Get-VM) {" kann durch "ForEach ($VM in Get-VM "VMNAME") {" ersetzt werden um nur eine bestimmte VM zu bearbeiten.
Hierfür wird ein zweiter Datastore benötigt, die VMDKs liegen am Ende wieder am selben Ort wie vor dem Convert (Auch wenn die VM HDDs auf verschiedenen Datastores hat).
Viel Spaß damit, hoffe es hilft dem ein oder anderen...
Code: Alles auswählen
$TempDatastore = "MySecondDatastoreName"
$ProgressPreference = "SilentlyContinue"
$WarningPreference = "Continue"
$ConfirmPreference = "None"
$ErrorActionPreference = "Continue"
ForEach ($VM in Get-VM) {
$WriteVM=$true
$VMDK_Name = @()
$VMDK_Path = @{}
ForEach ($HDD in $VM.HardDisks | ?{$_.StorageFormat -ne "Thin"}) {
If($WriteVM) { $WriteVM=$false; Write-Host -fore magenta "`nProcessing VM '$VM' ..."; }
$OriginalDatastore = $HDD.Filename -Replace '\[(.+)\].*',"`$1"
if ($OriginalDatastore -notmatch $TempDatastore) {
$VMDK = $HDD.Filename -Replace '.+/(.+)$',"`$1"
$VMDK_Name += $VMDK
$VMDK_Path.Add($VMDK,$OriginalDatastore)
Write-Host -fore yellow "Moving '$($HDD.Filename)' temporarily to '$TempDatastore' ..."
Move-HardDisk -HardDisk $HDD -Datastore $TempDatastore -StorageFormat thin
}
}
$VM = Get-VM $VM
ForEach ($HDD in $VM.HardDisks) {
$VMDK = $HDD.Filename -Replace '.+/(.+)$',"`$1"
if( $VMDK_Name -contains $VMDK ) {
$OriginalDatastore = $VMDK_Path.Get_Item($VMDK)
Write-Host -fore green "Moving '$($HDD.Filename)' back to '$OriginalDatastore' ..."
Move-HardDisk -HardDisk $HDD -Datastore $OriginalDatastore -StorageFormat thin
}
}
}