【发布时间】:2018-07-13 10:15:16
【问题描述】:
我正在编写迁移脚本的这一部分:
$devnames = Get-CMDevice -Name ($Site + "CSP*") | Remove-CMDevice
我得到这个错误:
输入对象也不能绑定到命令的任何参数 因为该命令不接受管道输入或输入及其 属性与任何接受管道输入的参数都不匹配。 + CategoryInfo : InvalidArgument: ([SecurityVerbs(..."USER1";看帮助,虽然这个cmdlet只能接受InputObject的输入
-输入对象 指定设备对象。要获取设备对象,请使用 Get-CMDevice cmdlet。 类型:IResultObject 职位:0 默认值:无 接受管道输入:True(ByValue) 接受通配符:False -姓名 指定设备的名称。 类型:字符串 别名:设备名称 职位:0 默认值:无 接受管道输入:False 接受通配符:False然后我尝试了这个:
$Site = Read-Host -Prompt "Enter 3 Letter Site Code"
$devnames = Get-CMDevice -Name ($Site + "*")
foreach ($device in $devicenames) { Remove-CMDevice $device }
我可以看到,也许我需要以某种方式将管道第一部分的设备转换为输入对象“值”?我认为除非我使用| Select Name 等,否则它们是,所以对最后一步感到困惑。有谁知道我哪里出错了?
【问题讨论】:
-
目标 cmdlet 似乎不接受按属性名称的管道输入,只是按值,所以我会尝试扩展输入对象的
Name属性:(Get-CMDevice -Name ($Site + "CSP*")).Name | Remove-CMDevice -
不幸的是,这对我不起作用@Ansgar输入对象不能绑定到命令的任何参数,因为命令不接受管道输入或输入及其属性不匹配任何接受管道输入的参数。 + CategoryInfo : InvalidArgument: (DEV01:PSObject) [Remove-CMDevice], ParameterBindingException + FullyQualifiedErrorId : InputObjectNotBound,Microsoft.ConfigurationManagement.Cmdlets.Collections.Commands.RemoveDeviceCommand
-
那么你很可能不得不使用循环,例如:
Get-CMDevice -Name ($Site + "CSP*") | ForEach-Object { Remove-CMDevice $_ }。我不确定为什么在某些情况下需要这样做,但我遇到过这样的情况:根据文档应该的 cmdlet 已经接受了管道输入,但没有。 -
@ansgar-wiechers 仅供参考(无法测试 atm)关于按价值理论和名称。 (设备和许多其他对象的)名称在 SCCM 中不是唯一的,因此它不是一种安全的方法。 Id 将是唯一的,所以也许这就是所需要的。
-
试图验证我的假设,即需要 Id,但从 SCCM 1802 开始,这似乎已修复。原来的管道现在可以正常工作了。
标签: powershell sccm