diff --git a/src/System.Management.Automation/engine/Modules/GetModuleCommand.cs b/src/System.Management.Automation/engine/Modules/GetModuleCommand.cs index 6b8400247dc..56a715b922d 100644 --- a/src/System.Management.Automation/engine/Modules/GetModuleCommand.cs +++ b/src/System.Management.Automation/engine/Modules/GetModuleCommand.cs @@ -573,9 +573,11 @@ private static IEnumerable GetCandidateModuleSpecs( IDictionary moduleSpecTable, PSModuleInfo module) { + const WildcardOptions options = WildcardOptions.IgnoreCase | WildcardOptions.CultureInvariant; foreach (ModuleSpecification moduleSpec in moduleSpecTable.Values) { - if (moduleSpec.Name == module.Name || moduleSpec.Name == module.Path || module.Path.Contains(moduleSpec.Name)) + WildcardPattern namePattern = WildcardPattern.Get(moduleSpec.Name, options); + if (namePattern.IsMatch(module.Name) || moduleSpec.Name == module.Path || module.Path.Contains(moduleSpec.Name)) { yield return moduleSpec; } diff --git a/test/powershell/Modules/Microsoft.PowerShell.Core/Get-Module.Tests.ps1 b/test/powershell/Modules/Microsoft.PowerShell.Core/Get-Module.Tests.ps1 index 8d851643785..8cc0c522391 100644 --- a/test/powershell/Modules/Microsoft.PowerShell.Core/Get-Module.Tests.ps1 +++ b/test/powershell/Modules/Microsoft.PowerShell.Core/Get-Module.Tests.ps1 @@ -33,6 +33,35 @@ Describe "Get-Module -ListAvailable" -Tags "CI" { @{ ModPath = "$TestDrive\Modules\Zoo\Too\Zoo.psm1"; Name = 'Zoo'; Version = '0.0'; Count = 1 } ) + $listModuleNameTestCases = @( + @{ + Name = 'Foo' + TestCaseName = 'Match case' + ExpectedName = 'Foo' + ModuleVersion = '2.0' + } + @{ + Name = 'foo' + TestCaseName = 'Mismatched case' + ExpectedName = 'Foo' + ModuleVersion = '2.0' + } + ) + $loadedModuleNameTestCases = @( + @{ + Name = 'Microsoft.PowerShell.Managemen*' + TestCaseName = 'Wildcard' + ExpectedName = 'Microsoft.PowerShell.Management' + ModuleVersion = '6.1.0.0' + } + @{ + Name = 'microsoft.powershell.managemen*' + TestCaseName = 'Mismatched case' + ExpectedName = 'Microsoft.PowerShell.Management' + ModuleVersion = '6.1.0.0' + } + ) + $env:PSModulePath = Join-Path $testdrive "Modules" } @@ -114,12 +143,38 @@ Describe "Get-Module -ListAvailable" -Tags "CI" { $modules[4].Path | Should -BeExactly (Resolve-Path "$testdrive\Modules\Zoo\Too\Zoo.psm1").Path } - It "Get-Module -FullyQualifiedName -ListAvailable" { - $moduleSpecification = @{ModuleName = "Foo"; ModuleVersion = "2.0"} + It "Get-Module -FullyQualifiedName @{ModuleName = '' ; ModuleVersion = ''} -ListAvailable - " -TestCases $listModuleNameTestCases { + param( + [Parameter(Mandatory = $true)] + $Name, + $TestCaseName, + [Parameter(Mandatory = $true)] + $ExpectedName, + $ModuleVersion + ) + + $moduleSpecification = @{ModuleName = $name ; ModuleVersion = $ModuleVersion} $modules = Get-Module -FullyQualifiedName $moduleSpecification -ListAvailable $modules | Should -HaveCount 1 - $modules.Name | Should -BeExactly "Foo" - $modules.Version | Should -BeExactly "2.0" + $modules.Name | Should -BeExactly $ExpectedName + $modules.Version | Should -BeExactly $ModuleVersion + } + + It "Get-Module -FullyQualifiedName @{ModuleName = '' ; ModuleVersion = ''} - " -TestCases $loadedModuleNameTestCases { + param( + [Parameter(Mandatory = $true)] + $Name, + $TestCaseName, + [Parameter(Mandatory = $true)] + $ExpectedName, + $ModuleVersion + ) + + $moduleSpecification = @{ModuleName = $name ; ModuleVersion = $ModuleVersion} + $modules = Get-Module -FullyQualifiedName $moduleSpecification + $modules | Should -HaveCount 1 + $modules.Name | Should -BeExactly $ExpectedName + $modules.Version | Should -BeExactly $ModuleVersion } It "Get-Module -Refresh -ListAvailable" { @@ -219,7 +274,7 @@ Describe "Get-Module -ListAvailable" -Tags "CI" { It "'Get-Module -ListAvailable' should not load the module assembly" { ## $fullName should be null and thus the result should just be the module's name. - $result = pwsh -c "`$env:PSModulePath = '$tempModulePath'; `$module = Get-Module -ListAvailable; `$fullName = [System.AppDomain]::CurrentDomain.GetAssemblies() | Where-Object Location -eq $assemblyPath | Foreach-Object FullName; `$module.Name + `$fullName" + $result = pwsh -noprofile -c "`$env:PSModulePath = '$tempModulePath'; `$module = Get-Module -ListAvailable; `$fullName = [System.AppDomain]::CurrentDomain.GetAssemblies() | Where-Object Location -eq $assemblyPath | Foreach-Object FullName; `$module.Name + `$fullName" $result | Should -BeExactly "MyModuelTest" } }