VMware Cloud Community
vin01
Expert
Expert
Jump to solution

modify output of Invoke-VMScript

Using this script I can get info of Hotfix installed status inside the GuestOS.

I am using try/catch method because I have 4 set of passwords in that any one of the password is correct.

Here is the output csv contain VMName ,OS ,IP ,RP ,Out1 ,Out2 ,Out3 ,Out4.

The problem here is while sending the csv file to the customers again i need to consolidate the results like this VMName ,OS ,IP ,RP ,Results. So is there any way after getting the output in $obj variable can we consolidate in the same script by removing the 'invalidlogin' or 'any other output'  and get only results( Hotfix installstatus) in one row and generate new csv file which contains results as below.

VMName ,OS ,IP ,RP ,Results.

If it works with excel also I am ok. I have imported the excel module for powershell.

Script I used

$script = @'

$hotfix = "KB4012598", "KB4012598", "KB4012598", "KB4012598", "KB4012212", "KB4012215", "KB4012212", "KB4012215", "KB4012213", "KB4012216", "KB4012214", "KB4012217", "KB4012213", "KB4012216", "KB4012606", "KB4013198", "KB4013429", "KB4013429"

$hotfixinfo = "No hotfix found!"

$fixes = Get-WmiObject -Class "win32_quickfixengineering" |

  where{$hotfix -contains $_.HotFixID} |

  Select -ExpandProperty HotFixID

if($fixes){

  $hotfixinfo = "$($fixes -join ',') installed"

}

$hotfixinfo

'@

$obj = foreach ($vm in Get-ResourcePool 'testpool'|Get-VM) { 

   $out1 = ""

   $out2 = ""

   $out3 = ""

   $out4 = ""

   $found = $false

   try

   $out1 = Invoke-VMScript -VM $vm.Name -GuestUser "administrator" -GuestPassword "" -ScriptText $script -ScriptType Powershell -ErrorAction Stop | Select-Object -ExpandProperty ScriptOutput

   $found = $true

catch [VMware.VimAutomation.ViCore.Types.V1.ErrorHandling.InvalidGuestLogin] { 

   $out1 = "Invalid logon" 

catch

   $out1 = "any other output" 

if (!$found) {

   try

   $out2 = Invoke-VMScript -VM $vm.Name -GuestUser "administrator" -GuestPassword "" -ScriptText $script -ScriptType Powershell -ErrorAction Stop | Select-Object -ExpandProperty ScriptOutput

   $found = $true

catch [VMware.VimAutomation.ViCore.Types.V1.ErrorHandling.InvalidGuestLogin] { 

   $out2 = "Invalid logon" 

catch

   $out2 = "any other output" 

}

if (!$found) {

   try

   $out3 = Invoke-VMScript -VM $vm.Name -GuestUser "administrator" -GuestPassword "" -ScriptText $script -ScriptType Powershell -ErrorAction Stop | Select-Object -ExpandProperty ScriptOutput

   $found = $true

catch [VMware.VimAutomation.ViCore.Types.V1.ErrorHandling.InvalidGuestLogin] { 

   $out3 = "Invalid logon" 

catch

   $out3 = "any other output" 

}

}

if (!$found) {

   try

   $out4 = Invoke-VMScript -VM $vm.Name -GuestUser "admin" -GuestPassword "" -ScriptText $script -ScriptType Powershell -ErrorAction Stop | Select-Object -ExpandProperty ScriptOutput

   $found = $true

catch [VMware.VimAutomation.ViCore.Types.V1.ErrorHandling.InvalidGuestLogin] { 

   $out4 = "Invalid logon" 

catch

   $out4 = "any other output" 

}

}

New-Object PSObject -Property (

  [ordered]@{

   Name = $vm.Name

   OS   = $vm.Guest.OSFullName

   Out1 = $out1

   Out2 = $out2

   Out3 = $out3

   Out4 = $out4

  })

}

$obj | Export-Csv -Path C:\Users\Administrator\Desktop\WCstatusonser29_latest-off.csv -NoTypeInformation -NoClobber 

Sample output:

pastedImage_6.png

--------------

Expected after consolidating;

pastedImage_7.png

Regards Vineeth.K
0 Kudos
1 Solution

Accepted Solutions
LucD
Leadership
Leadership
Jump to solution

Try like this.
Not needing the results for each user option, also allows simplifying the script.

All user combinations are now stored in an array, over which the script loops.

$script = @'

$hotfix = "KB4012598", "KB4012598", "KB4012598", "KB4012598", "KB4012212", "KB4012215", "KB4012212", "KB4012215", "KB4012213", "KB4012216", "KB4012214", "KB4012217", "KB4012213", "KB4012216", "KB4012606", "KB4013198", "KB4013429", "KB4013429"

$hotfixinfo = "No hotfix found!"

$fixes = Get-WmiObject -Class "win32_quickfixengineering" |

  where{$hotfix -contains $_.HotFixID} |

  Select -ExpandProperty HotFixID

if($fixes){

  $hotfixinfo = "$($fixes -join ',') installed"

}

$hotfixinfo

'@

$accounts = @(

   @{

   User = 'administrator'

   Pswd = 'pswd1'

   },

   @{

   User = 'administrator'

   Pswd = 'pswd2'

   },

   @{

   User = 'administrator'

   Pswd = 'pswd3'

   },

   @{

   User = 'admin'

   Pswd = 'pswd4'

   }

)


Get-ResourcePool -Name 'testpool' -PipelineVariable rp |

ForEach-Object -Process {

   Get-VM -Location $rp -PipelineVariable vm |

   ForEach-Object -Process {

   $out = 'Login failed'

   foreach ($user in $accounts)

   {

   try

   {

   $sInvoke = @{

   VM = $vm

   GuestUser = $user.User

   GuestPassword = $user.Pswd

   ScriptText = $script

   ScriptType = 'Powershell'

   ErrorAction = 'Stop'

   }

   $out = Invoke-VMScript @sInvoke | Select-Object -ExpandProperty ScriptOutput

   break

   }

   catch

   {

   }

   }

   New-Object PSObject -Property (

   [ordered]@{

   Name = $vm.Name

   OS = $vm.Guest.OSFullName

   IP = $vm.Guest.IPAddress -join '|'

   RP = $rp.Name

   Result = $out

   })

   }

} |

Export-Csv -Path C:\Users\Administrator\Desktop\WCstatusonser29_latest-off.csv -NoTypeInformation -NoClobber

------------------------------------------------------------------------------------------------------------------

Was it helpful? Let us know by completing this short survey here.


Blog: lucd.info  Twitter: @LucD22  Co-author PowerCLI Reference

View solution in original post

0 Kudos
4 Replies
LucD
Leadership
Leadership
Jump to solution

Try like this.
Not needing the results for each user option, also allows simplifying the script.

All user combinations are now stored in an array, over which the script loops.

$script = @'

$hotfix = "KB4012598", "KB4012598", "KB4012598", "KB4012598", "KB4012212", "KB4012215", "KB4012212", "KB4012215", "KB4012213", "KB4012216", "KB4012214", "KB4012217", "KB4012213", "KB4012216", "KB4012606", "KB4013198", "KB4013429", "KB4013429"

$hotfixinfo = "No hotfix found!"

$fixes = Get-WmiObject -Class "win32_quickfixengineering" |

  where{$hotfix -contains $_.HotFixID} |

  Select -ExpandProperty HotFixID

if($fixes){

  $hotfixinfo = "$($fixes -join ',') installed"

}

$hotfixinfo

'@

$accounts = @(

   @{

   User = 'administrator'

   Pswd = 'pswd1'

   },

   @{

   User = 'administrator'

   Pswd = 'pswd2'

   },

   @{

   User = 'administrator'

   Pswd = 'pswd3'

   },

   @{

   User = 'admin'

   Pswd = 'pswd4'

   }

)


Get-ResourcePool -Name 'testpool' -PipelineVariable rp |

ForEach-Object -Process {

   Get-VM -Location $rp -PipelineVariable vm |

   ForEach-Object -Process {

   $out = 'Login failed'

   foreach ($user in $accounts)

   {

   try

   {

   $sInvoke = @{

   VM = $vm

   GuestUser = $user.User

   GuestPassword = $user.Pswd

   ScriptText = $script

   ScriptType = 'Powershell'

   ErrorAction = 'Stop'

   }

   $out = Invoke-VMScript @sInvoke | Select-Object -ExpandProperty ScriptOutput

   break

   }

   catch

   {

   }

   }

   New-Object PSObject -Property (

   [ordered]@{

   Name = $vm.Name

   OS = $vm.Guest.OSFullName

   IP = $vm.Guest.IPAddress -join '|'

   RP = $rp.Name

   Result = $out

   })

   }

} |

Export-Csv -Path C:\Users\Administrator\Desktop\WCstatusonser29_latest-off.csv -NoTypeInformation -NoClobber

------------------------------------------------------------------------------------------------------------------

Was it helpful? Let us know by completing this short survey here.


Blog: lucd.info  Twitter: @LucD22  Co-author PowerCLI Reference

0 Kudos
vin01
Expert
Expert
Jump to solution

I tried to execute the script on one resource pool but its giving below error.

pastedImage_0.png

Regards Vineeth.K
0 Kudos
LucD
Leadership
Leadership
Jump to solution

Must have been a copy/paste issue, the code block for the ForEach-Object didn't start on the same line.

I corrected above.


Blog: lucd.info  Twitter: @LucD22  Co-author PowerCLI Reference

0 Kudos
vin01
Expert
Expert
Jump to solution

Super Sir. Its worked as expected.

Regards Vineeth.K
0 Kudos