使用 Powershell 删除 Windows 上的 ShellIconOverlayIdentifiers
Use Powershell to delete ShellIconOverlayIdentifiers on Windows
我目前对 Dropbox 和 Nextcloud 感到非常恼火,它们都在与 ShellIconOverlayIdentifier 列表作斗争。很多人在网上搜索时似乎都会遇到的问题。
现在我想结合我的烦恼和我学习powershell(7.2.0)的意图。
我从以下脚本开始,它将检索所有密钥。后来我想通过 -match
使用正则表达式来查找我想删除的条目。现在我同时使用 Remove-Item -WhatIf
和 Get-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\...
既不以 驱动器规范 也不以 \
或 /
开头,它被解释为 相对 路径,导致您看到的症状。
我目前对 Dropbox 和 Nextcloud 感到非常恼火,它们都在与 ShellIconOverlayIdentifier 列表作斗争。很多人在网上搜索时似乎都会遇到的问题。
现在我想结合我的烦恼和我学习powershell(7.2.0)的意图。
我从以下脚本开始,它将检索所有密钥。后来我想通过 -match
使用正则表达式来查找我想删除的条目。现在我同时使用 Remove-Item -WhatIf
和 Get-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\...
既不以 驱动器规范 也不以 \
或 /
开头,它被解释为 相对 路径,导致您看到的症状。