PowerShell Get-Uptime直接接收Get-ADComputer输出异常原因求解
Get-Uptime管道绑定异常原因分析
基础前提
Get-Uptime的$ServerName参数配置了两类管道绑定规则:
ValueFromPipeline = $true:支持将整个管道输入对象直接绑定到该参数ValueFromPipelineByPropertyName = $true:支持从管道输入对象的同名/别名属性取值绑定到该参数,同时参数设置了别名ComputerName、Name
PowerShell处理管道输入的参数绑定时,优先匹配ValueFromPipeline的类型兼容绑定,只有当整个输入对象无法和参数类型兼容转换时,才会触发ValueFromPipelineByPropertyName的属性绑定逻辑。
直接传ADComputer对象失败的原因
Get-ADComputer -Filter *返回的是ADComputer类型的Active Directory计算机对象,当它直接通过管道传给Get-Uptime时:
- 优先触发
ValueFromPipeline绑定逻辑:PowerShell尝试将ADComputer对象隐式转换为$ServerName要求的string[]类型,转换结果是AD对象的可分辨名称(DN),格式类似CN=PC01,OU=Computers,DC=domain,DC=com,并非计算机的网络可识别名称(NetBIOS名/主机名) - 后续
Get-CimInstance用DN作为目标计算机名发起连接,无法识别目标主机,因此运行失败。
加Select Name后运行正常的原因
添加Select Name步骤后,管道传递的是仅包含Name属性的自定义PSObject对象:
- 该自定义对象无法直接隐式转换为
string[]类型,因此ValueFromPipeline绑定失败 - 触发
ValueFromPipelineByPropertyName绑定逻辑:匹配到输入对象的Name属性(和$ServerName的别名匹配),取出Name属性对应的合法计算机名绑定给$ServerName,后续Get-CimInstance可正常连接目标主机,因此运行正常。
内容的提问来源于stack exchange,提问作者santhosh n
相关产品推荐
相关产品推荐

