This is part 5 of my series of the most common PowerShell
errors that are made in my PowerShell classes.
I will be posting one a day to help you understand why an error occurred
and what the error’s meaning is.
Today’s error: The input object cannot be bound to any parameters for the command either because the command does not take pipeline input or the input and its properties do not match any of the parameters that take pipeline input.
Here is our starting code:
Get-ADComputer -filter
* |
Select-Object
-Property @{Name="ComputerName";Expression={$_.Name}}|
Get-WMIobject
-ClassName Win32_Bios
And here is the full error:
Get-WMIobject : The input object cannot be bound to any parameters
for the command either because the command does not take pipeline
input or the input and its properties do not match any of the
parameters that take pipeline input.
At line:3 char:9
+ Get-WMIobject
-ClassName Win32_Bios
+
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidArgument:
(@{ComputerName=DomainAdmins1}:PSObject) [Get-WmiObject],
ParameterBindingException
+ FullyQualifiedErrorId :
InputObjectNotBound,Microsoft.PowerShell.Commands.GetWmiObjectCommand
We need to ask ourselves “What information am I passing to
Get-WMIObject?” and “Why?” If we execute
the first two commands we get this:
ComputerName
------------
DC
SVR1
CL1
SVR2
EX1
DomainAdmins1
By the looks of things, we are passing objects with a
ComputerName property to Get-WMIObject.
I’m willing to bet the intent is to execute Get-WMIObject against remote
devices. OK, is this possible through
the PowerShell Pipeline. Let’s see if
Get-WMIObject has a –ComputerName
parameter.
-ComputerName []
Specifies the
target computer for the management operation. Enter a fully qualified domain
name, a NetBIOS name, or an IP
address. When the
remote computer is in a different domain than the local computer, the fully
qualified domain name is
required.
The default is the
local computer. To specify the local computer, such as in a list of computer
names, use "localhost",
the local computer
name, or a dot (.).
This parameter does
not rely on Windows PowerShell remoting, which uses WS-Management. You can use
the ComputerName
parameter of
Get-WmiObject even if your computer is not configured to run WS-Management
remote commands.
Required? false
Position? named
Default value none
Accept pipeline
input? false
Accept wildcard
characters? false
It does, and it accepts multiple values. The only problem, it does not accept input
from the pipeline. This will not work
unless we recode.
Resolution:
Use ForeEach-Object.
ForeEach-Object
has the unique capability of tricking cmdlets into being used in the PowerShell
pipeline. Take a look at this code:
Get-ADComputer -filter
* |
ForEach-Object
{
Get-WMIobject
-ClassName Win32_Bios
-ComputerName $_.Name
}
Here we are encapsulating the Get-WMIObject cmdlet inside of ForEach-Object.
We do need to explicitly use the –ComputerName
parameter of Get-WMIObject. Remember,
it does not accept pipeline input and we are not attempting to pass it pipeline
input directly. We also need to specify
which property of the current object in the PowerShell Pipeline that we want to
use. In this case, it is the value of
the name property.
Comments