Как я могу удалить эти псевдонимы - PullRequest
0 голосов
/ 08 июня 2018

Я пытаюсь обновить модуль PSFTP из галереи.Я использовал Remove-Module, но эти три (3) псевдонима остаются.Как я могу удалить их перед установкой текущего модуля PSFTP?

PS C:\src\t\ftp> Get-Command *ftp*

CommandType     Name                                               Version    Source
-----------     ----                                               -------    ------
Alias           Move-FTPItem                                       1.6.1.2    PSFTP
Alias           Receive-FTPItem                                    1.6.1.2    PSFTP
Alias           Send-FTPItem                                       1.6.1.2    PSFTP
Function        Get-SFTPChildItem                                  2.0.2      Posh-SSH
Function        Get-SFTPContent                                    2.0.2      Posh-SSH
...

PS C:\src\t\ftp> Remove-Item -Path Alias:Move-FTPItem
Remove-Item : Cannot find path 'Alias:\Move-FTPItem' because it does not exist.
At line:1 char:1
+ Remove-Item -Path Alias:Move-FTPItem
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : ObjectNotFound: (Alias:\Move-FTPItem:String) [Remove-Item], ItemNotFoundException
    + FullyQualifiedErrorId : PathNotFound,Microsoft.PowerShell.Commands.RemoveItemCommand

Дополнительная информация

Я не уверен, как PSFTP попал на эту машину.Использование Uninstall-Module даже в разделе «Запуск от имени администратора» не работает.Как я могу правильно удалить этот модуль?

PS C:\Windows\system32> Uninstall-Module -Name PSFTP
PackageManagement\Uninstall-Package : No match was found for the specified search criteria and module names 'PSFTP'.
At C:\Program Files\WindowsPowerShell\Modules\PowerShellGet\1.0.0.1\PSModule.psm1:2157 char:21
+ ...        $null = PackageManagement\Uninstall-Package @PSBoundParameters
+                    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : ObjectNotFound: (Microsoft.Power...ninstallPackage:UninstallPackage) [Uninstall-Package], Exception
    + FullyQualifiedErrorId : NoMatchFound,Microsoft.PowerShell.PackageManagement.Cmdlets.UninstallPackage

Каталог модуля на машине существует.

C:\Windows\System32\WindowsPowerShell\v1.0\Modules\PSFTP

Ответы [ 2 ]

0 голосов
/ 08 июня 2018

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
      

Определение местоположения модуля (установочной папки):

  • По имя модуля (например, PSFTP):

    Split-Path (Get-Module -ListAvailable PSFTP).Path
    
    • -ListAvailable гарантирует, что модуль найден, даже если он не импортирован в данный момент, но только если онis находится в одном из каталогов, перечисленных в $env:PSModulePath.
    • И наоборот, если модуль в настоящее время импортирован, но находится в каталоге нестандартный , вы чаще всего опустить -ListAvailable, чтобы найти его.
    • Несколько версий модуля могут быть установлены и, следовательно, возвращены;тот, у которого номер версии самый высокий, указан первым.
  • По имени команды , экспортируемой модулем (например, Send-FTPItem):

    Split-Path (Get-Command Send-FTPItem).Module.Path
    
    • Get-Command находит команду независимо от того, импортируется ли содержащий модуль в данный момент.
    • Если модуль, содержащий команду с таким именем , загружен (импортирован) в текущий момент, возвращается его путь.
    • В противном случае, если установлено несколько версий модулей, сообщается эффективная одна, то есть та, которая имеет наивысший номер версии.
0 голосов
/ 08 июня 2018

Вы используете remove-item, например так:

Remove-Item alias:\aliasname

пример:

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...