Q: I'm trying to pass a bunch of objects from one command to another in PowerShell. The command complains that it doesn't take pipeline input. How can I pass my list of objects for further processing?

A: I was recently writing a script to return information on remote machines based on a list from Active Directory (AD). I wanted to pass my computer objects gained from an AD query into the get-wmiobject cmdlet. However, the -computer switch of get-wmiobject didn't accept a passed list of objects via the pipeline, so I got an error.

The solution is to use the ForEach-Object cmdlet instead to pass attributes from the piped list of objects that can be accessed using the $_.<attribute>. For example, consider the command

 Get-ADComputer -filter \\{lastLogonTimestamp-gt $lastLogon\\} | get-wmiobject Win32_ComputerSystem

 This fails because the objects from Get-ADComputer can't be processed by get-wmiobject as a piped list of objects. However, the following works great:

 Get-ADComputer -filter \\{lastLogonTimestamp -gt $lastLogon\\} | ForEach-Object \\{get-wmiobject Win32_ComputerSystem -computer $_.name\\}

Notice that all I did was wrap the second command in the ForEach-Object and pass the $_.name for the -computer switch input.

Hide comments


  • Allowed HTML tags: <em> <strong> <blockquote> <br> <p>

Plain text

  • No HTML tags allowed.
  • Web page addresses and e-mail addresses turn into links automatically.
  • Lines and paragraphs break automatically.