我正在尝试从库中更新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
答案 0 :(得分:3)
Remove-Module
卸载模块,但不会将其从文件系统中删除。
默认情况下$PSModuleAutoLoadingPreference
(All
),这意味着模块及其命令仍然可被发现 ,即使模块目前尚未加载(导入)。
实际上,此特定模块仅导出 别名,这就是为什么它们只显示在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
(如果没有依赖项,将没有输出),(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
)是为系统模块保留的({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)