首页 > 解决方案 > 在 Windows 上使用 Powershell 删除 ShellIconOverlayIdentifiers

问题描述

我目前对 Dropbox 和 Nextcloud 非常恼火,它们都与 ShellIconOverlayIdentifier 列表作斗争。当您搜索互联网时,许多人似乎都有一个问题。

现在我想将我的烦恼与学习 powershell (7.2.0) 的意图结合起来。

我从以下脚本开始,它将检索所有密钥。后来我想使用正则表达式-match来查找我要删除的条目。现在我与两者一起工作Remove-Item -WhatIfGet-ItemProperty对其进行测试。

目前我的问题是我可以按预期创建我的列表。但是当我将列表输入删除命令时,我发现找不到路径。我究竟做错了什么?

Push-Location -Path Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\ShellIconOverlayIdentifiers

$list = Get-ChildItem -Path .

$filteredList = $list -match "DropboxExt10"

$filteredList

# Remove-Item -WhatIf -Recurse $filteredList
Get-ItemProperty $filteredList

Pop-Location

错误Cannot find path 'Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\ShellIconOverlayIdentifiers\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\ShellIconOverlayIdentifiers\ DropboxExt10' because it does not exist.显然是将路径添加为当前位置的相对路径。为什么它不解释为绝对路径?当我省略推送位置部分时,它会尝试将注册表路径添加到脚本所在的当前工作目录中。但这也是错误的。

提前感谢您的帮助。

标签: windowspowershellregistry

解决方案


使用以下方法之一:

$filteredList | Remove-Item -WhatIf -Recurse

# Alternatively:
Remove-Item -LiteralPath $filteredList.PSPath -WhatIf -Recurse

上述命令确保注册表项(键)通过其属性由其完整的、提供者限定的路径绑定到Remove-Item'-LiteralPath参数;.PSPath注册表路径的情况下,路径的提供程序前缀是(或者,如果也不需要Microsoft.PowerShell.Core\Registry::识别原始模块Registry::,则在您的Push-Location调用中使用)

似乎正在发生的事情是,当项目被字符串化时 - 当您将它们作为一个整体传递时会发生这种情况,作为参数(例如Remove-Item $filteredlist,与 相同Remove-Item -Path $filteredlist),它们缺少提供程序前缀并表示为注册表本机路径

并且鉴于完整的注册表本机路径(例如HKEY_LOCAL_MACHINE\...既不以驱动器规范开头也不以\or开头/),它被解释为相对路径,从而导致您看到的症状。


推荐阅读