Используйте Powershell для удаления идентификаторов Shelliconoverlay в Windows

0

Вопрос

В настоящее время меня очень раздражают 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. Внешне он добавляет путь как относительный путь к текущему местоположению. Почему это не интерпретируется как абсолютный путь? Когда я удаляю часть push-местоположения, она пытается добавить путь к реестру в мой текущий рабочий каталог, в котором находится скрипт. Но и это тоже неправильно.

Заранее спасибо за вашу помощь.

powershell registry windows
2021-11-16 19:48:52
1

Лучший ответ

1

Используйте одно из следующих:

$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\... ни начинается со спецификации привода, ни с \ или /, это интерпретируется как относительный путь, приводящий к симптому, который вы видели.

2021-11-16 21:21:42

Спасибо за подробное объяснение. Оба варианта работают. На самом деле я придумал третье решение. Не могли бы вы добавить это в свой ответ, чтобы у нас были все варианты здесь? foreach ($item in $filteredList) {Remove-Item -WhatIf -Recurse Registry::$item}. На самом деле мне начинал нравиться Powershell. Но, учитывая, что моя версия не сработала, но ваше первое предложенное решение работает, заставляет меня задуматься.
Gunter

Спасибо, что согласился, Гюнтер; я рад, что объяснение было полезным. Честно говоря, учитывая, что решения в ответе более лаконичны (без цикла) и быстрее, чем foreach-циклическое решение, я не думаю, что последнее стоит добавлять. Да, не совсем понятно, почему $filteredList | Remove-Item -WhatIf -Recurse работает (см. Этот ответ), и причуды, связанные с проходящими путями, могут расстраивать. Но, несмотря на все свои бородавки, PowerShell может многое предложить.
mklement0

Спасибо за дополнительную ссылку. Я вижу, что мне нужно довольно много узнать, чтобы понять, как командлеты Powershell на самом деле обрабатывают информацию. А также спасибо, что указали, что решение с циклом на самом деле будет медленнее. Действительно, Powershell может многое предложить. В настоящее время мне очень нравится это для автоматизации вещей, которые в противном случае заняли бы довольно много кликов (перезапуск служб, удаление записей реестра, перезапуск explorer.exe). Так что я ожидаю отношений любви-ненависти с powershell на данный момент :-)
Gunter

На других языках

Эта страница на других языках

Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................