使用其版本号删除PowerShell模块

时间:2016-03-19 02:51:57

标签: powershell

是否有一种简单的方法可以将版本作为参数传递给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

1 个答案:

答案 0 :(得分:9)

请参阅: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参数接受以@ {ModuleName =&#34; modulename&#34 ;;格式指定的模块名称; ModuleVersion =&#34; version_number&#34;}

基于此,您应该遵循以下内容:

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:\测试\ 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:\测试\ 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.
  

请注意,在删除1.2.0.2时,它按预期工作。删除1.1.0.1时,将删除1.1.0.1和1.2.0.2!