In any view, the values of the view properties represent the state of the server-side objects at the time the view was created. These property values are not updated automatically.

In a production environment, the state of managed objects on the server is likely to change frequently. If your client script depends on the server being in a particular state (poweredOn or poweredOff, for example), then you can refresh the view object’s state. You can use the vSphere SDK for Perl Vim::update_view_data() subroutine to refresh the values of client-side views with server-side values. Updating the State of View Objects uses Vim::update_view_data() to refresh view data.

Updating the State of View Objects

#!/usr/bin/perl
use strict;
use warnings;
use VMware::VIRuntime;
. . .
# Get all VirtualMachine objects
my $vm_views = Vim::find_entity_views(view_type => 'VirtualMachine');

# Power off virtual machines.
foreach my $vm (@$vm_views) {
    # Refresh the state of each view
    $vm->update_view_data();
    if ($vm->runtime->powerState->val eq 'poweredOn') {
       $vm->PowerOffVM();
       print " Stopped virtual machine: " . $vm->name . "\n";
    } else {
       print " Virtual machine " . $vm->name .
    " power state is: " . $vm->runtime->powerState->val . "\n";
    }
}