尝试接受一个对象并将其作为字符串筛选为一个值。并将该字符串保存为变量,然后在另一个命令中使用该变量作为标志的值。
因此,这个命令将获得PNPDevice InstanceID
$x = (Get-PnpDevice -PresentOnly -Class 'Net' | Where-Object {$_.FriendlyName -EQ 'Intel(R) Ethernet Connection I217-LM'} | Select-Object -ExpandProperty InstanceId | Format-Table -AutoSize | out-string )
在这里,我检查变量X及其内容和类型,因为下一个命令禁用-PNPDevice和标志instanceID必须是一个字符串。
PS C:\Temp> $x.GetType()
IsPublic IsSerial Name BaseType
-------- -------- ---- --------
True True String System.Object
PS C:\Temp> echo $x
PCI\VEN_1234&DEV_543A&SUBSYS_32A39857&REV_04\3&1234839&0&C8
当我尝试将$x用于-InstanceId时,我会得到以下错误
PS C:\Temp> Disable-PnpDevice -InstanceId $x
Disable-PnpDevice : Invalid query
At line:1 char:1
+ Disable-PnpDevice -InstanceId $x
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidArgument: (Win32_PnPEntity:ROOT\cimv2\Win32_PnPEntity) [Disable-PnpDevice], CimException
+ FullyQualifiedErrorId : HRESULT 0x80041017,Disable-PnpDevice
但是,如果我用字符串手动创建变量,它就能正常工作。
PS C:\Temp> $y = "PCI\VEN_1234&DEV_543A&SUBSYS_32A39857&REV_04\3&1234839&0&C8"
PS C:\Temp> Disable-PnpDevice -InstanceId $y
PS C:\Temp> $y.GetType()
IsPublic IsSerial Name BaseType
-------- -------- ---- --------
True True String System.Object
谢谢。
发布于 2022-09-20 19:55:44
从您的命令中省略| Format-Table -AutoSize | out-string
,这不仅在您的示例中是多余的( .InstanceId
属性已经是一个字符串),而且导致实例ID字符串有一个尾随的换行符,这很可能是造成问题的原因。
一般情况:
Format-*
cmdlet发出输出对象,其唯一目的是向PowerShell的显示输出格式系统提供格式化指令。简而言之:只使用cmdlet来格式化显示的数据,而对于随后的编程处理E 217
--有关更多信息,请参见这个答案。Out-String
在其输出字符串中盲目地追加一个尾随的换行符,这是意外的,也是不方便的:参见GitHub问题#14444。- Note: With a _single_ input object (such as in your case), `-NoNewLine` can be used to suppress the trailing newline (but `Out-String` is never needed for an input object that already _is_ a string).
- The problem is that with _multiple_ input objects, `-NoNewLine` also suppresses newlines _between_ their representations; e.g., `'one', 2 | Out-String -NoNewLine` yields verbatim `one2`
https://stackoverflow.com/questions/73791905
复制相似问题