We are in day 1 of a PowerShell class here in Phoenix. I’ve been keeping an eye on PowerShell.com
and PowerShell.org to try and find questions that we can help with. Right before we started our topic on saving
and retrieving objects from disk, an IT pro asked a question concerning getting
and processing information about their virtual machines.
Get-VM | Out-File
C:\ps\VMS.txt
$VMs = Get-Content
-Path C:\PS\VMS.txt
ForEach ($VM
in $VMs)
{
$VM | Select-Object -Property
Name
Get-VM $VM | Get-DatastoreCluster
}
Do you see the problem here?
The IT Pro is correctly getting his virtual machine objects. The problem is he is saving them to a text
file. Let’s look at the text file.
PS C:\> Get-Content -Path C:\ps\VMS.txt
Name State CPUUsage(%) MemoryAssigned(M) Uptime Status Versi
on
---- ----- ----------- ----------------- ------ ------ -----
CL1 Off 0
0 00:00:00 Operating normally 7.0
CL2 Off 0
0 00:00:00 Operating normally 7.0
DC Running 0 1132 1.22:38:46.2550000 Operating
normally 6.2
EX1 Off 0
0 00:00:00 Operating normally 7.0
S1 Running 0 512 1.22:38:45.3760000 Operating
normally 7.0
S2 Running 0 512 1.22:38:45.1660000 Operating
normally 7.0
SVR1 Off 0
0 00:00:00 Operating normally 6.2
SVR2 Off 0
0 00:00:00 Operating normally 6.2
Test1 Off 0 0 00:00:00 Operating normally 7.0
It looks just like what you would expect if you executed
Get-VM. Let’s look at the objects
produced by Get-VM and Get-Content.
PS C:\> Get-Content -Path C:\ps\VMS.txt |
Get-Member |
Select-Object
-first 1 -ExpandProperty Typename
System.String
PS C:\> Get-VM |
Get-Member |
Select-Object
-First 1 -ExpandProperty Typename
Microsoft.HyperV.PowerShell.VirtualMachine
The object types are different. If you want to save your objects to disk, a
text file will not work. Consider using
Export-CliXml. Yes, I know. It is harder to read. If you are not planning on automating
a process, go ahead and save it as a text file.
You will then have to manually read it and manually execute your
actions. This IT Pro was trying to automate a process. A text file was not working. This will:
Get-VM | Export-Clixml
-Path c:\ps\Vms.xml
$VMs = Import-Clixml
-Path C:\ps\Vms.xml
ForEach ($VM
in $VMs)
{
$VM | Select-Object -Property
Name
#Get-VM $VM |
Get-DatastoreCluster
}
You may have noticed that I commented out the Get-VM $VM
line. Well, that is another error in his
code, but that is for another time.
Comments