2016-03-19 3 views
5

Есть ли какой-либо простой способ передать версию в качестве параметра в get-module? У меня есть две разные версии Azure Powershell установлены:удаление модуля 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 

ответ

7

Пожалуйста, см: 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. 

Примечание:

FullyQualifiedNam e принимает имя модуля, указанное в формате @ {ModuleName = "modulename"; ModuleVersion = "номер_версия"}

Исходя из этого, следующие должна быть то, что вы после:

Remove-Module -FullyQualifiedName @{ModuleName = "Azure"; ModuleVersion = "1.0.2"} 

Improved Ответа (редактировать)

ли больше расследования по этому вопросу , и есть некоторые причуды при удалении с использованием 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. 

Обратите внимание, что при удалении 1.2.0.2, он работает, как ожидалось. При удалении 1.1.0.1 удаляются как 1.1.0.1, так и 1.2.0.2!

+0

Похоже, что тип справки 'String []' неверен. Фактический тип - 'ModuleSpecification []'. Один из конструкторов 'ModuleSpecification' принимает хеш-таблицу. –

+0

@RomanKuzmin, он примет либо 'string', либо' [version] ', но ваш комментарий заставил меня провести некоторое дополнительное тестирование, и я узнал немало. См. Улучшенный ответ. Спасибо за отзывы, которые привели к этому гораздо лучшему, более точному ответу. –

Смежные вопросы