Get-ChildItem管道进入ForEach-Object Get-ItemProperty - $ _ path将当前工作目录与HKLM注册表路径连接起来?

时间:2015-10-14 12:39:39

标签: windows powershell

我在这里查了几个答案,发现这似乎是一个常见的问题,但没有一个建议对我有用。

当我这样做时

Get-ChildItem "Microsoft.PowerShell.Core\Registry::HKLM\SYSTEM\CurrentControlSet\Control\Class\{4d36e972-e325-11ce-bfc1-08002be10318}\"

它返回预期的内容,该注册表位置中的所有注册表项(" thingys")的列表("注册表文件夹thingie"),即我机器中的网络适配器(包括隐藏的)。

现在我想不仅仅将所有内容转储到输出中,只需将每个密钥的DriverDesc值转储,即"英特尔(R)双频无线-AC 7265"和一些奇怪的"微软ISATAP适配器"名字也是。

将此命令流水线化为ForEach-Object Get-ItemProperty派对似乎是理想的解决方案,但是当我尝试时,我得到一个奇怪的错误:

Get-ChildItem "Microsoft.PowerShell.Core\Registry::HKLM\SYSTEM\CurrentControlSet\Control\Class\{4d36e972-e325-11ce-bfc1-08002be10318}\" | ForEach-Object {Get-ItemProperty $_.Name}

错误:

Get-ItemProperty : Cannot find path 'C:\Users\Folder\Powershell\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Class\{4d36e972-e325-11ce-bfc1-08002be10318}\0000' because it does not exist. 
At line:1 char:155

管道doohickey似乎将我当前的工作目录与HKLM注册表路径连接起来并尝试访问该注册表项,这当然不存在。

为了确保piplining不是很奇怪,我试着写下这些名字:

Get-ChildItem "Microsoft.PowerShell.Core\Registry::HKLM\SYSTEM\CurrentControlSet\Control\Class\{4d36e972-e325-11ce-bfc1-08002be10318}\" | ForEach-Object {Write-Host $_.Name}

结果是我的预期:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Class\{4d36e972-e325-11ce-bfc1-08002be10318}\0000
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Class\{4d36e972-e325-11ce-bfc1-08002be10318}\0001
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Class\{4d36e972-e325-11ce-bfc1-08002be10318}\0002

但问题似乎是路径提供程序在管道方中被丢弃而Get-ItemProperty没有处理它。

1 个答案:

答案 0 :(得分:1)

现在,我发现要获得我想要的东西,我需要再次将路径提供程序Microsoft.PowerShell.Core\Registry::附加到管道方输出,然后处理结果。

Get-ChildItem "Microsoft.PowerShell.Core\Registry::HKLM\SYSTEM\CurrentControlSet\Control\Class\{4d36e972-e325-11ce-bfc1-08002be10318}\" | ForEach-Object {Get-ItemProperty "Microsoft.PowerShell.Core\Registry::$_"}

提供正确的输出,但我想只显示DriverDesc,我可以按如下方式进行操作

Get-ChildItem "Microsoft.PowerShell.Core\Registry::HKLM\SYSTEM\CurrentControlSet\Control\Class\{4d36e972-e325-11ce-bfc1-08002be10318}\" | ForEach-Object {$(Get-ItemProperty "Microsoft.PowerShell.Core\Registry::$_" -Name DriverDesc).DriverDesc}

输出,如我所愿:

Intel(R) Ethernet Connection I217-LM
Microsoft Kernel Debug Network Adapter
Microsoft ISATAP Adapter

我还发现我可以使用$ _。pspath

Get-ChildItem "Microsoft.PowerShell.Core\Registry::HKLM\SYSTEM\CurrentControlSet\Control\Class\{4d36e972-e325-11ce-bfc1-08002be10318}\" | ForEach-Object {$(Get-ItemProperty $_.pspath -Name DriverDesc).DriverDesc}