Remove-Module
выгружает модуль, но не удаляет его из файловой системы.
С $PSModuleAutoLoadingPreference
по умолчанию (All
), это означает, что модуль и его команды по-прежнему обнаружимы , даже если модуль в данный момент не загружен (не импортирован).
Как это происходит, этот конкретныймодуль экспортирует только псевдонимы, поэтому только они отображаются в выходных данных Get-Command *ftp*
.
В то время как Get-Command
может найти псевдонимы из не загруженных в данный момент (импортированных)Модули, такие псевдонимы , а не присутствуют на диске Alias:
и пытаются удалить их с помощью Remove-Item Alias:<name>
или, более точно, Remove-Alias <name>
сбой .
Если вы хотите до удалить модуль перед установкой новой версии - при условии, что вы установили его из галереи PowerShell, как вы говорите (см. Обновление ниже) - use Uninstall-Module
.
Тем не менее, чтобы до обновить установленный модуль , просто используйте Update-Module
.
Обратите внимание, что выполняет параллельную установку , однако: пока самая новая версиявступает в силу, предыдущая версия сохраняется и при необходимости требует ручного удаления.
Если модуль не был установлен изPowerShell Gallery , требуется ручное удаление ее папки :
Убедитесь, что другие модули не зависят отмодуль для удаления .
Чтобы найти зависимостей модуля , то есть другие модули, которые зависят от него, использовать, например, (Я использую модуль PackageManagement
в качестве примера, в котором модуль PowerShellGet
является зависимым):
Get-Module -ListAvailable |
Where-Object { $_.RequiredModules.Name -contains 'PackageManagement' }
- Обратите внимание, что могут быть сценарии которые также полагаются на этот модуль, и такое использование будет намного сложнее обнаружить (за исключением поиска во всех сценариях директив
#requires -Module
, вызовов using -module statements
, Import-Module
или просто вызовов модуля cкоманды, основанные на автоматической загрузке модуля).
Для выполнения операции обратная , т. е. чтобы найти зависимости модуля, если таковые имеются (модули, от которых зависит данный модуль), используйте, например:
(Get-Module -ListAvailable PowerShellGet).RequiredModules
(не будет никакого вывода, если нет зависимостей), - Точно так же, как указывает @lit (OP), вы можете запросить модуль, доступный в PowerShell Gallery, для определения его зависимостей в Интернете;Например:
Find-Module -IncludeDependencies PowerShellGet
(сначала будет указан сам модуль, а затем его зависимости).
В зависимости от места установки модуля, вам могут потребоваться права администратора для удаления (сеанс с повышенными правами).
Это определенно относится к C:\Windows\System32\WindowsPowerShell\v1.0\Modules\PSFTP
.
Обратите внимание, что каксторонний модуль, PSFTP
никогда не должен был быть установлен там, потому что C:\Windows\System32\WindowsPowerShell\v1.0\Modules
($PSHOME\Modules
) зарезервирован для системных модулей (тех, которые поставляются с PowerShell).
Как только вы подтвердите, что можно безопасно удалить папку модуля, используйте следующее (удалите -WhatIf
, чтобы выполнить фактическое удаление):
Remove-Item -Recurse -Force -WhatIf C:\Windows\System32\WindowsPowerShell\v1.0\Modules\PSFTP
Определение местоположения модуля (установочной папки):
По имени команды , экспортируемой модулем (например, Send-FTPItem
):
Split-Path (Get-Command Send-FTPItem).Module.Path
Get-Command
находит команду независимо от того, импортируется ли содержащий модуль в данный момент. - Если модуль, содержащий команду с таким именем , загружен (импортирован) в текущий момент, возвращается его путь.
- В противном случае, если установлено несколько версий модулей, сообщается эффективная одна, то есть та, которая имеет наивысший номер версии.