4

REG_SZ我在使用以下方法获取值时遇到了一些奇怪的问题:

(get-itemproperty -Path "Registry::HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Uninstall\VLC media player" -Name UninstallString).UninstallString

(get-itemproperty -Path "Registry::HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Uninstall\VLC media player" -Name UninstallString).UninstallString

get-itemproperty : Cannot find path 'HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Uninstall\VLC media player' because it
does not exist.
At line:1 char:2
+ (get-itemproperty -Path "Registry::HKEY_LOCAL_MACHINE\Software\Microsoft\Windows ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : ObjectNotFound: (HKEY_LOCAL_MACH...LC media player:String) [Get-ItemProperty], ItemNotFoundException
    + FullyQualifiedErrorId : PathNotFound,Microsoft.PowerShell.Commands.GetItemPropertyCommand

此方法适用于另一个REG_SZ没有问题的方法,但是当我调用下面的许多键时,Uninstall它会失败。

具体来说,它适用于:

(get-itemproperty -Path "Registry::HKEY_CURRENT_USER\Software\Microsoft\Command Processor" -Name autorun).AutoRun

这两个数据条目都存在于我的系统上,在 regedit 中可见....

但是,非常有趣的是,它们不存在于以下结果中:

Get-ChildItem "Registry::HKEY_LOCAL_MACHINE\software\microsoft\windows\currentversion\uninstall\"

还有几个“丢失”的键。这似乎是我不熟悉的一些奇怪的注册表命名空间虚拟化(类似于 HKEY_CLASSES_ROOT)?

4

1 回答 1

5

一个论坛线程引导我找到答案。

它讨论了 32 位和 64 位程序的注册表虚拟化

test-path在这种情况下,由于键“丢失”,因此必须检查其他路径(请注意,在尝试任何“错误”操作之前,我应该检查带有条件的路径)。

PS > (dir HKLM:\SOFTWARE\wow6432node\Microsoft\Windows\CurrentVersion\Uninstall | measure).count
134
PS > (dir hklm:\software\microsoft\windows\currentversion\uninstall | measure).count
134

所以,我必须运行 32 位 powershell.exe。

PS > [Environment]::Is64BitProcess
False 

此外,HKEY_CLASSES_ROOT\Installer\Products另一个位置列出了随 Windows Installer 安装的程序。

这个答案对于 32 位和 64 位 powershell.exe 很有帮助

这个问题的解决方案是健壮的。我稍微修改了之前链接的函数,使其更易于访问。

PS我在macbook pro上的bootcamp上运行Windows 7。奇怪的是,无论我执行什么 powershell.exe,它都是 32 位的。我根本看不到注册表项,无论该位置是否位于wow6432node.

于 2013-09-10T02:10:38.217 回答