Sometime when using cmdlets there might be cases where you would assume two cmdlets would work together naturally and they just don’t. A good example of this is anything that takes -ComputerName as an input parameter (E.g test-connection) and the Get-ADComputer command.
In this example if you run Get-ADComputer -filter * you get a list of all computers in the current domain, say you now want to run Test-Connection to check machines are online, you might think you could just go:
Get-ADComputer -filter * | test-connection
Unfortunately you will be greeted with a wall of red text, this is because Get-ADComputer does not output an object with a ComputerName property, instead it has either Name or DNSHostName. You might now decide to output it all to a text file and ping them manually but your using PowerShell and there are easy ways do do this on the fly.
Method 1: Create a custom property on the ADComputer object with the name “ComputerName” so the next command receives what it expects:
Get-ADComputer -Filter * | select @{n="ComputerName"; e={$_.DNSHostName}} | Test-Connection
Method 2: Specify the name of the ADComputer object’s property in the next cmdlets input:
Get-ADComputer -Filter * | Test-Connection -ComputerName {$_.DNSHostName}
Using either of the above methods works with any cmdlet that accepts ComputerName as a pipeline input parameter.