gpt4 book ai didi

powershell - 使用版本号删除 PowerShell 模块

转载 作者:行者123 更新时间:2023-12-04 14:10:29 50 4
gpt4 key购买 nike

有没有一种简单的方法可以将版本作为参数传递给 Get-Module ?

我安装了两个不同版本的 Azure PowerShell:

C:\WINDOWS\system32> get-module -name azure -listavailable

Directory: C:\Program Files\WindowsPowerShell\Modules\...

ModuleType Version Name
---------- ------- ----
Manifest 1.0.4 Azure

Directory: C:\Program Files (x86)\Microsoft SDKs\Azure\...

ModuleType Version Name
---------- ------- ----
Manifest 1.0.2 Azure

我希望使用以下命令删除其中一个:
Get-Module -name azure -version 1.0.2 | remove-module

最佳答案

请参阅:get-help Remove-Module -full

-FullyQualifiedName [<String[]>]
Removes modules with names that are specified in the form of
ModuleSpecification objects (described by the Remarks section of Module
Specification Constructor (Hashtable) on MSDN). For example, the
FullyQualifiedName parameter accepts a module name that is specified in the
format @{ModuleName = "modulename"; ModuleVersion = "version_number"} or
@{ModuleName = "modulename"; ModuleVersion = "version_number"; Guid =
"GUID"}. ModuleName and ModuleVersion are required, but Guid is optional.

You cannot specify the FullyQualifiedName parameter in the same command as a
Name parameter; the two parameters are mutually exclusive.

注意:

FullyQualifiedName parameter accepts a module name that is specified in the format @{ModuleName = "modulename"; ModuleVersion = "version_number"}



基于此,以下应该是您所追求的:
Remove-Module -FullyQualifiedName @{ModuleName = "Azure"; ModuleVersion = "1.0.2"}

改进的答案(编辑)

对此进行了更多调查,使用 ModuleVersion 删除时有一些怪癖(可以是 string[version] )。

如果您指定 ModuleVersion , Remove-Module将删除具有该版本及更高版本的所有匹配模块。

要获得显式匹配,您还必须传递 guid .
Get-Module 'Azure' | where {([string]($_.Version)).StartsWith('1.0.2')} | Remove-Module

由于要输入的内容很多,我建议在您的个人资料中添加一个功能以使其更容易。
function Remove-ModuleWithVersion
{
param (
[Parameter(Mandatory=$true)]
[string]
$Module,

[Parameter(Mandatory=$true)]
[string]
$VersionToMatch
)


Get-Module $Module | where {([string]($_.Version)).StartsWith($VersionToMatch)} | Remove-Module -Verbose
}

并调用:
Remove-ModuleWithVersion 'Azure' '1.0.2'

测试分析

我不妨分享一下我是如何测试这个得出我的结论的。我将把一些细节留给读者进行自我调查......

创建两个模块,并从每个模块中导出一个函数,使用不同的函数名称使测试更容易。

D:\test\modtest\v1\ModTest.psd1 版本为 1.1.0.1
D:\test\modtest\v1\ModTest.psm1
function Show-Hello1
{
"Hello v1.1"
}

Export-ModuleMember -Function Show-Hello1

D:\test\modtest\v2\ModTest.psd1 版本为 1.2.0.2
D:\test\modtest\v2\ModTest.psm1
function Show-Hello2
{
"Hello v1.2"
}

Export-ModuleMember -Function Show-Hello2

创建一个函数来加载模块,调用导出的函数,之前显示模块,使用指定的参数删除模块,之后显示模块。
function Invoke-LoadAndRemove($minor, $useString, $guid = $null)
{
"`n------`n$($minor), $($useString), '$($guid)'"

"`nimport modules..."
ipmo D:\test\modtest\v1\ModTest.psd1 -Force #-Verbose
ipmo D:\test\modtest\v2\ModTest.psd1 -Force #-Verbose

"call exported functions..."
Show-Hello1
Show-Hello2

"modules before..."
Get-Module *mod*

if ($useString)
{
$ver = "1.$minor.0.$minor"
}
else
{
$ver = [version]::new(1, $minor, 0, $minor)
}

"`nremoving version: $ver, -> $($ver.GetType()), useGuid=$($useGuid)"

if ($useGuid)
{
Remove-Module -FullyQualifiedName @{ModuleName = "ModTest"; ModuleVersion = $ver} -Verbose
}
else
{
Remove-Module -FullyQualifiedName @{ModuleName = "ModTest"; ModuleVersion = $ver; Guid = $guid} -Verbose
}

"modules after..."
Get-Module *mod*


"done."
}

调用各种方法来演示 Remove-Module 的工作原理......
Invoke-LoadAndRemove 2 $true
Invoke-LoadAndRemove 1 $true
Invoke-LoadAndRemove 2 $false
Invoke-LoadAndRemove 1 $false
Invoke-LoadAndRemove 1 $false 'b213dea3-4ae3-4fde-a9c6-0ac4a8d1890c'
Invoke-LoadAndRemove 2 $true '02fdc44a-2c32-4f7b-8573-b1317b03269a'

这是部分,我留给读者进一步分析输出以验证本文的结论。

也就是说,这是我注意到的,这促使我进一步调查:
modules before...
Script 1.2.0.2 ModTest Show-Hello2
Script 1.1.0.1 ModTest Show-Hello1

removing version: 1.2.0.2, -> string, useGuid=
VERBOSE: Performing the operation "Remove-Module" on target "ModTest (Path: 'D:\test\modtest\v2\ModTest.psm1')".
VERBOSE: Removing the imported "Show-Hello2" function.
modules after...
Script 1.1.0.1 ModTest Show-Hello1
done.

------
modules before...
Script 1.2.0.2 ModTest Show-Hello2
Script 1.1.0.1 ModTest Show-Hello1

removing version: 1.1.0.1, -> string, useGuid=
VERBOSE: Performing the operation "Remove-Module" on target "ModTest (Path: 'D:\test\modtest\v2\ModTest.psm1')".
VERBOSE: Performing the operation "Remove-Module" on target "ModTest (Path: 'D:\test\modtest\v1\ModTest.psm1')".
VERBOSE: Removing the imported "Show-Hello2" function.
VERBOSE: Removing the imported "Show-Hello1" function.
modules after...
done.

Notice that when removing 1.2.0.2, it works as expected. When removing 1.1.0.1, both 1.1.0.1 and 1.2.0.2 are removed!

关于powershell - 使用版本号删除 PowerShell 模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36097266/

50 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com