【问题标题】:Use Powershell to delete ShellIconOverlayIdentifiers on Windows在 Windows 上使用 Powershell 删除 ShellIconOverlayIdentifiers
【发布时间】:2021-12-27 21:23:54
【问题描述】:

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

提前感谢您的帮助。

【问题讨论】:

    标签: windows powershell registry


    【解决方案1】:

    使用以下方法之一:

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

    上述命令确保注册表项(键)通过其.PSPath 属性由其提供者限定的完整路径绑定到Remove-Item-LiteralPath 参数;对于注册表路径,路径的提供者前缀是Microsoft.PowerShell.Core\Registry::(或者,如果不需要识别原始模块,则使用Registry::,如你的Push-Location 电话)

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

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

    【讨论】:

    • 感谢您的详细解释。两种变体都有效。其实我想出了第三种解决方案。您能否将其添加到您的答案中,以便我们在这里拥有所有选项? foreach ($item in $filteredList) {Remove-Item -WhatIf -Recurse Registry::$item}。实际上我开始喜欢 Powershell。但是鉴于我的版本不起作用,但您提出的第一个解决方案确实有效,这让我感到奇怪。
    • 感谢您的接受,Gunter;我很高兴解释很有帮助。老实说,鉴于答案中的解决方案比foreach-loop 解决方案更简洁(无循环)和更快,我认为后者不值得添加。是的,$filteredList | Remove-Item -WhatIf -Recurse 起作用的原因并不明显(请参阅this answer),并且通过路径周围的怪癖可能会令人沮丧。但是,尽管有很多缺点,PowerShell 还是有很多东西可以提供的。
    • 感谢您提供附加链接。我知道我必须学习很多才能了解 Powershell cmdlet 是如何实际处理信息的。还要感谢您指出循环解决方案实际上会更慢。事实上,Powershell 有很多东西可以提供。我目前真的很喜欢它自动化的东西,否则需要点击几下(重新启动服务,删除注册表项,重新启动 explorer.exe)。所以我现在期待与 powershell 的爱恨交织:-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-19
    相关资源
    最近更新 更多