В этой статье рассмотрим, как корректно удалить установленные на компьютере PowerShell модули. Обычно это нужно, когда вы хотите очистить систему от старых или неиспользуемых версий модулей, ускорить время загрузки PowerShell, или удалить конфликтующие модули.
Вывести список сторонних PowerShell модулей, установленных на компьютере через зарегистрированные репозитории, можно с помощью команды:
Get-InstalledModule
Эта команда выведет список всех штатно установленных и зарегистрированных сторонних PS модулей (установленных с помощью командлета Install-Module). В данном случае все модули установлены через репозиторий PSGallery.
Чтобы удалить один из установленных модулей, укажите его имя в команде Uninstall-Module. Например:
Uninstall-Module -Name PSWindowsUpdate
На компьютере может быть установлено несколько версий модуля. Командлет может как удалить самую последнюю версию модуля, так и упасть в ошибку, если було обнаружено несколько версий. Список доступных версий модуля можно вывести:
Get-Module pswindowsupdate -ListAvailable
Удалить определению версию:
Uninstall-Module -Name PSWindowsUpdate -RequiredVersion 2.2.1.5 -Verbose
Удалить все версии:
Uninstall-Module -Name PSWindowsUpdate -AllVersions
Invoke-Command -ComputerName srv1 -ScriptBlock {Uninstall-Module PSWindowsUpdate -RequiredVersion 1.5.0 -Force -Verbose}
При удалении модуля может появится ошибка о том, что модуль используется:
WARNING: The version '2.2.1.5' of module 'PSWindowsUpdate' is currently in use. Retry the operation after closing the applications. PackageManagement\Uninstall-Package : Module 'PSWindowsUpdate' is in currently in use or you don't have the required permissions.
Чтобы удалить такой модуль, нужно закрыть сессию PowerShell, в которой он загружен (импортирован). Вывести список модулей, загруженных в текущую сессию:
Get-Module
Если нужно выгрузить модуль из памяти, не закрывая текущую консоль, выполните:
Remove-Module -Name PSWindowsUpdate
После этого попробуйте удалить модуль еще раз (в некоторых случая нужно добавить параметр -Force, однако его использование может быть вредным, т.к. может принудительное удаление может сломать зависимости других модулей):
Uninstall-Module -Name PSWindowsUpdate -Force
Если модуль, который вы хотите удалить загружается автоматически при старте PowerShell сессии (например, через файлы профилей PS1), можно удалить модуль, запустив PowerShell сессию без профиля:
Powershell.exe -NoProfile -Command "Uninstall-Module ImportExcel"
Полный список доступных PowerShell модулей на компьютере (как установленных через репозиторий, так и модулей установленных вручную) можно вывести так:
Get-Module -ListAvailable|select name,version,path
В столбце path указано расположение файлов модуля. В Windows PowerShell можно использовать (импортировать) модули, установленные (скопированные) в следующие директории:
C:\Users\%username%\Documents\WindowsPowerShell\Modules C:\Program Files\WindowsPowerShell\Modules C:\Windows\system32\WindowsPowerShell\v1.0\Modules
Этот список путей доступен в переменной окружения $env:PSModulePath:
В PowerShell Core 7.x в переменной $env:PSModulePath дополнительно используются следующие пути:
c:\program files\windowsapps\microsoft.powershell_7.5.2.0_x64__8wekyb3d8bbwe\Modules C:\Program Files\PowerShell\Modules C:\program files\powershell\7\Modules
Т.к. у некоторых модулей при удалении могут остаться некоторый файлы, иногда дополнительно нужно еще очистить оставшиеся файлы в каталоге модуля. Например такой скрипт удалить модуль и очистит содержимое папки модуля, если она не пустая:
$Module = Get-Module ImportExcel -ListAvailable
Uninstall-Module $Module.Name -verbose
Remove-Item $Module.ModuleBase -Recurse -Force