Powershell:无法访问注册表值

rbl8hiat  于 2022-11-29  发布在  Shell
关注(0)|答案(3)|浏览(191)

我需要取得“UninstallString”的值
计算机\HKEY_本地计算机\软件\WOW6432节点\Microsoft\Windows\当前版本\卸载{1535CAA3 - 9F33 - 414E-8987 - 0365169BE741}
呼叫:

Get-Item -path HKLM:\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall\{1535CAA3-9F33-414E-8987-0365169BE741}
  • 获取项:找不到接受参数'1535CAA3 - 9F33 - 414E-8987 - 0365169BE741'位置参数 *
jhiyze9q

jhiyze9q1#

js2010's helpful answer指出,* 缺少引用 * 是您的主要问题({}是PowerShell * 元字符 *),为了补充x1e0 f1,:
在PowerShell v5及更高版本中,可以使用Get-ItemPropertyValue cmdlet直接返回与注册表项的 value 关联的数据:

# Note the use of '...' around the registry path 
# and the value name UninstallString at the end.
Get-ItemPropertyValue 'HKLM:\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall\{1535CAA3-9F33-414E-8987-0365169BE741}' UninstallString

至于你试过什么
HKLM:\...\{1535CAA3-9F33-414E-8987-0365169BE741}之类的 * 未加引号 * 参数的行程方式如下:

  • 因为{...}创建了一个script block,所以它被认为是一个 * 单独 * 参数的开始,* 字符串 * 'HKLM:\...\'和 * 脚本块 * {1535CAA3-9F33-414E-8987-0365169BE741}作为 * 两个 * 参数传递。
  • 因为Get-Item并不需要 extra(位置)参数,所以它会相应地抱怨,并在错误消息中使用脚本块的 string representation
  • 脚本块的字符串表示形式是其 * 逐字内容 *,不包括{},您可以使用{1535CAA3-9F33-414E-8987-0365169BE741}.ToString()进行验证

如前所述,* 引号 * 是解决方案,并且由于路径既不包含PowerShell变量引用也不包含子表达式,因此使用 * 单引号 *,即 verbatim 字符串文字('...')是最佳的。
(通常不太理想的)替代方法是坚持使用 * 不带引号的 * 参数,并使用带有```的PowerShell元字符的 * 单独转义 *(所谓的反勾号);例如:
Write-Output HKLM:\...\{1535CAA3-9F33-414E-8987-0365169BE741}

ryoqjall

ryoqjall2#

类似于下面的引号,因为大括号看起来像powershell的脚本块:

get-itemproperty 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{013DB423-A8DE-4423-9E50-D45ED1041789}' uninstallstring | 
  % uninstallstring

MsiExec.exe /I{013DB423-A8DE-4423-9E50-D45ED1041789}

虽然对于msi,您可以在powershell 5.1中使用此命令卸载:

get-package *chrome* | uninstall-package

对于其他非msi安装,uninstallstring在这里。通常您必须添加一个额外的选项,如“/S”,用于静默卸载。

get-package *firefox* | % { $_.metadata['uninstallstring'] }

"C:\Program Files\Mozilla Firefox\uninstall\helper.exe"
qij5mzcb

qij5mzcb3#

正如我所说的,你需要把路径 Package 在""中,但是这仍然是行不通的。要在powershell中获得注册表值,请使用Registry::HKEY_LOCAL_MACHINE\...作为路径。一旦你获得了RegistryKey对象,你就可以使用GetValue(string name)来获得UninstallString的值。所以你的命令看起来像这样:

(Get-Item -path "Registry::HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall\{1535CAA3-9F33-414E-8987-0365169BE741}").GetValue("UninstallString")

相关问题