Search code examples
arrayspowershellarraylistpowershell-cmdlet

Why can't I store the return value of a cmdlet [CimInstance] inside an arraylist?


I'm currently working on a script where i retrieve the following data on a host:

  • List of installed printers
  • List of installed printer drivers
  • List of used printer drivers

At the moment i simply achieve it this way:

$installedPrinters = Get-Printer
$installedDrivers = Get-PrinterDriver | Sort-Object -Property Name
$usedDrivers = $printerList | Sort-Object -Property DriverName | Select-Object DriverName | Get-Unique -AsString

For convenience reasons i'm now trying to use an arraylist instead of 3 different variables for storing this data but i somehow don't seem to get this to work. As soon as i try something like that ...

$data.Add({Get-Printer})

or

Get-Printer | $data.Add($_)

... i get either a bunch of errors or simply the value 'Get-Printers' as string stored in the arraylist. Weirdly enough it seems to work if i first store the returned data from the Get-Printer cmdlet inside a dedicated variable and then add this variable to the arraylist.

Can somebody please help me get my head around this? As of now this behaviour doesn't really seem to make any sense to me.


Solution

  • Your syntax is flawed.

    Use one of the following (assuming that $data contains a System.Collections.ArrayList instance):

    $data.AddRange((Get-Printer))
    

    Or, less efficiently:

    Get-Printer | ForEach-Object { $null = $data.Add($_) }