如何删除这些别名

lit*_*lit 5 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
Run Code Online (Sandbox Code Playgroud)

附加信息

我不确定是如何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
Run Code Online (Sandbox Code Playgroud)

模块目录确实存在于机器上。

C:\Windows\System32\WindowsPowerShell\v1.0\Modules\PSFTP
Run Code Online (Sandbox Code Playgroud)

mkl*_*nt0 3

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

使用$PSModuleAutoLoadingPreference默认值 ( All),这意味着即使当前未加载(导入)模块,该模块及其命令仍然是可发现的。

碰巧的是,这个特定的模块导出别名,这就是为什么只有它们出现在Get-Command *ftp*.

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

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

也就是说,为了更新安装的模块,只需使用Update-Module.
但请注意,这会执行并行安装:虽然最新版本确实生效,但以前的版本将被保留,并且需要手动删除(如果需要)。


如果该模块不是从 PowerShell Gallery 安装的,则需要手动删除其文件夹

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

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

      Get-Module -ListAvailable |
        Where-Object { $_.RequiredModules.Name -contains 'PackageManagement' }
      
      Run Code Online (Sandbox Code Playgroud)
      • 但请注意,可能存在也依赖于该模块的脚本,并且此类使用将更难检测(缺少在所有脚本中搜索#requires -Module指令、using -module statements调用Import-Module或简单地调用依赖于自动加载的模块命令的方法)模块)。
    • 要执行操作,即查找模块的依赖项(如果有)(给定模块本身依赖的模块),请使用,例如:

      • (Get-Module -ListAvailable PowerShellGet).RequiredModules(如果没有依赖则不会有输出),
      • 同样,正如 @lit(OP)指出的那样,您可以在线查询 PowerShell 库中可用的模块以获取其依赖项;例如:(
        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
      
      Run Code Online (Sandbox Code Playgroud)

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

  • 模块名称(例如,PSFTP):

    Split-Path (Get-Module -ListAvailable PSFTP).Path
    
    Run Code Online (Sandbox Code Playgroud)
    • -ListAvailable确保即使当前未导入该模块,但仅当该模块位于 中列出的目录之一时,也能找到该模块$env:PSModulePath
    • 相反,如果当前导入了一个模块但驻留在非标准目录中,则为了找到它,您通常会忽略该模块。 -ListAvailable
    • 一个模块的多个版本可能会被安装并因此被返回;版本号最高的版本列在最前面。
  • 通过模块导出的命令的名称Send-FTPItem(例如, ):

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