我正在尝试从库更新 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)
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(如果没有依赖则不会有输出),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查找该命令,无论包含的模块当前是否已导入。