使用 Powershell 删除 Windows 上的 ShellIconOverlayIdentifiers

Use Powershell to delete ShellIconOverlayIdentifiers on Windows

我目前对 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. 显然它将路径添加为当前位置的相对路径。为什么它不解释为绝对路径?当我省略推送位置部分时,它会尝试将注册表路径添加到脚本所在的当前工作目录中。但这也是错误的。

提前感谢您的帮助。

使用以下之一:

$filteredList | Remove-Item -WhatIf -Recurse

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

以上命令确保注册表项(键)由它们的完整的、提供商限定的路径绑定到Remove-Item-LiteralPath参数,通过他们的 .PSPath 属性;在 registry paths 的情况下,路径的提供者前缀是 Microsoft.PowerShell.Core\Registry::(或者,如果不需要识别原始 module , Registry::, 在您的 Push-Location 通话中使用)

似乎正在发生的事情是,当项目被 字符串化时 - 这就是当您将它们 作为一个整体 传递时发生的情况, 作为参数(例如Remove-Item $filteredlist,与Remove-Item -Path $filteredlist相同),它们缺少提供者前缀并且是表示为 registry-native paths.

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