Author Posts

July 12, 2016 at 7:52 pm

Hi

New to PowerShell, I was wondering when using Invoke-command against a number of machines is there away to return the data back to a variable on the local session? I get when a need to bring a variable from the local machine to the remote session you need to use param with -argumentlist but don't get it vice versa.

Thanks
Carl

July 12, 2016 at 7:59 pm

$data = Invoke-Command -ComputerName compy -ScriptBlock {Get-ChildItem c:\}

Just a simple assignment, excepting that the $data will have extra properties that invoke-command adds in. One of those properties is the computer name, so that is what you can use to filter out the results per the computer that returned them. $data will hold the results of all computers it is ran against.

  • This reply was modified 2 years, 1 month ago by  Craig Duff.
  • This reply was modified 2 years, 1 month ago by  Craig Duff.

July 12, 2016 at 8:14 pm

this works local for one machine
_______________________________________________
$Array = @()

$Groups = get-pvsauthgroup

Foreach ($Group in $Groups.AuthGroupName) {

$PVSGroup = get-pvsauthgroup -AuthGroupName $Group | Select-Object AuthGroupName, Description

$PVSGroupUsage = Get-PvsAuthGroup -AuthGroupName $Group | Get-PvsAuthGroupUsage | Select-Object Name, Role

$PVSSite = Get-PVSSite | Select-Object SiteName

$Props = [ordered]@{'PVS Site'=$PVSSite.SiteName;
'AuthGroupName'=$PVSGroup.AuthGroupName;
'Description'=$PVSGroup.Description;
'Permission'=$PVSGroupUsage.Name;
'Role'=$PVSGroupUsage.Role

}
$obj = New-Object -TypeName PSObject -Property $Props
$array += $obj
}
$array

__________________
this is what I am trying remotely for a few machines

$Array = @()
Foreach ($PVServer in $PVServers.name) { Invoke-Command -Computername $PVSServer -ScriptBlock {
Import-Module 'C:\Program Files\Citrix\Provisioning Services Console\Citrix.PVS.SnapIn.dll'

$Groups = get-pvsauthgroup
Foreach ($Group in $Groups.AuthGroupName) {
$PVSGroup = get-pvsauthgroup -AuthGroupName $Group | Select-Object AuthGroupName, Description
$PVSGroupUsage = Get-PvsAuthGroup -AuthGroupName $Group | Get-PvsAuthGroupUsage | Select-Object Name, Role
$Props = [ordered]@{'PVS Site'=$PVSSite.SiteName;
'AuthGroupName'=$PVSGroup.AuthGroupName;
'Description'=$PVSGroup.Description;
'Permission'=$PVSGroupUsage.Name;
'Role'=$PVSGroupUsage.Role
}
$obj = New-Object -TypeName PSObject -Property $Props
$array += $obj
}}}

July 12, 2016 at 8:29 pm

$Array =  Invoke-Command -Computername $PVSServers.name -ScriptBlock {
#...
New-Object -TypeName PSObject -Property $Props
}#...

You are not going to be able to reference the memory space on the local computer from the remote, you'll have to catch the returned values.

July 12, 2016 at 8:34 pm

sorry...not sure I understand, have you given me something to try or are you saying its not possible? sorry little confused.

July 12, 2016 at 8:40 pm

Its not possible the way you are trying it, because $array is in the memory of the local computer and the remote computer can't access $array. So,

$obj = New-Object #...
$array += $obj

cannot work.

You have to modify the script block to return a value, hence my examples change of not assigning the result of New-Object to $obj and just having New-Object by itself. Then on the local computer side, assigning the results to a variable. My example was something to try with everything I didn't change commented out so to highlight my suggested changes.

  • This reply was modified 2 years, 1 month ago by  Craig Duff.
  • This reply was modified 2 years, 1 month ago by  Craig Duff.

July 12, 2016 at 9:15 pm

Thank you so much Craig..it worked 🙂

Now to get it into HTML...