如何删除这些别名

时间:2018-06-08 01:06:58

标签: powershell

我正在尝试从库中更新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 :(得分:3)

Remove-Module 卸载模块,但不会将其从文件系统中删除。

默认情况下$PSModuleAutoLoadingPreferenceAll),这意味着模块及其命令仍然可被发现 ,即使模块目前尚未加载(导入)。

实际上,此特定模块仅导出 别名,这就是为什么它们只显示在Get-Command *ftp*的输出中。

虽然Get-Command能够从当前未加载(导入)的模块中找到别名,但Alias:驱动器中存在 这样的别名并尝试删除它们使用Remove-Item Alias:<name>或更直接地Remove-Alias <name> 失败

如果您希望在安装新版本之前 卸载模块 - 假设您已经从PowerShell库安装了它,正如您所说(请参阅下面的更新) ) - 使用Uninstall-Module

也就是说,为了 更新已安装的模块,只需使用Update-Module
请注意,此执行并排安装,但是:当最新版本生效时,之前的版本保留并要求如果需要,可以手动删除。

如果从PowerShell库安装模块 ,则需要 手动删除其文件夹

  • 确保没有其他模块依赖于要删除的模块

    • 找到模块的依赖项 ,即依赖于它的其他模块,请使用,例如(我使用模块PackageManagement作为示例,其中模块PowerShellGet作为依赖项:

      Get-Module -ListAvailable |
        Where-Object { $_.RequiredModules.Name -contains 'PackageManagement' }
      
      • 但请注意,可能还有依赖此模块的脚本,并且此类使用将更难检测(缺少搜索#requires -Module指令的所有脚本,{ {1}},using -module statements调用,或者只是调用依赖于自动加载模块的模块命令。
    • 执行反向操作,即查找模块的依赖 ,如果有的话(模块a)给定模块本身取决于),使用,例如:

      • Import-Module(如果没有依赖项,将没有输出),
      • 同样,正如@lit(OP)指出的那样,您可以在线查询PowerShell库中可用的模块以查找其依赖项;例如: -
        (Get-Module -ListAvailable PowerShellGet).RequiredModules(这将首先列出模块本身,然后是依赖项)。
  • 根据模块的安装位置,您可能需要管理员权限才能删除(提升会话)。

    • Find-Module -IncludeDependencies PowerShellGet的情况绝对如此 请注意,作为第三方模块,C:\Windows\System32\WindowsPowerShell\v1.0\Modules\PSFTP永远不应该安装在那里,因为PSFTPC:\Windows\System32\WindowsPowerShell\v1.0\Modules)是为系统模块保留的({1}}与PowerShell一起发布的。

    • 一旦您确认删除模块文件夹是安全的,请使用以下命令(删除$PSHOME\Modules以执行实际删除):

      -WhatIf

确定模块的位置(安装文件夹):

  • 通过模块名称 (例如Remove-Item -Recurse -Force -WhatIf C:\Windows\System32\WindowsPowerShell\v1.0\Modules\PSFTP ):

    PSFTP
    • Split-Path (Get-Module -ListAvailable PSFTP).Path 确保即使模块当前未导入,也会找到该模块,但前提是该模块位于-ListAvailable中列出的其中一个目录中。
    • 相反,如果模块 当前已导入,但位于非标准目录中,则大多数省略 $env:PSModulePath按顺序找到它。
    • 可以安装模块的多个版本,因此返回;首先列出版本号最高的那个。
  • 通过模块导出的命令 的名称(例如-ListAvailable):

    Send-FTPItem
    • Split-Path (Get-Command Send-FTPItem).Module.Path 查找命令是否当前导入包含模块。
    • 如果当前加载(导入)包含该名称​​的命令的模块,则返回其路径。
    • 否则,如果安装了多个模块版本,则会报告有效版本,即版本号最高的版本。

答案 1 :(得分:-1)

你使用remove-item,如下所示:

Remove-Item alias:\aliasname

示例:

enter image description here