PowerShellGetv2
PowerShellGetv2 copied to clipboard
Find-Module -AllVersions does not produce output
A Windows PowerShell v5.1 session:
PS H:\> $PSVersionTable
Name Value
---- -----
PSVersion 5.1.17763.1007
PSEdition Desktop
PSCompatibleVersions {1.0, 2.0, 3.0, 4.0...}
BuildVersion 10.0.17763.1007
CLRVersion 4.0.30319.42000
WSManStackVersion 3.0
PSRemotingProtocolVersion 2.3
SerializationVersion 1.1.0.1
PS H:\> Import-Module PowerShellGet
PS H:\> Get-Module PowerShellGet
ModuleType Version Name ExportedCommands
---------- ------- ---- ----------------
Script 2.2.4.1 PowerShellGet {Find-Command, Find-DscResource, Find-Module, Find-RoleCapability...}
PS H:\> Get-PSRepository
Name InstallationPolicy SourceLocation
---- ------------------ --------------
LocalPSRepo Trusted C:\Users\xxx\Documents\PowerShell\Local Repository\
PSGallery Untrusted https://www.powershellgallery.com/api/v2
NetworkPSRepo Trusted H:\PowerShell\Repository\
PS H:\> dir H:\PowerShell\Repository
Directory: H:\PowerShell\Repository
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a---- 5/4/2020 2:54 PM 3577 DBModule.1.0.nupkg
-a---- 5/4/2020 2:55 PM 3584 DBModule.1.1.nupkg
PS H:\> Find-Module DBModule -AllVersions
PS H:\> Find-Module DBModule -Repository NetworkPSRepo -AllVersions -Verbose
VERBOSE: Repository details, Name = 'NetworkPSRepo', Location = 'H:\PowerShell\Repository\'; IsTrusted = 'True'; IsRegistered = 'True'.
VERBOSE: Using the provider 'PowerShellGet' for searching packages.
VERBOSE: Using the specified source names : 'NetworkPSRepo'.
VERBOSE: Getting the provider object for the PackageManagement Provider 'NuGet'.
VERBOSE: The specified Location is 'H:\PowerShell\Repository\' and PackageManagementProvider is 'NuGet'.
VERBOSE: Total package yield:'2' for the specified package 'DBModule'.
PS H:\> Remove-Module PowerShellGet
PS H:\> Import-Module PowerShellGet -RequiredVersion 1.0.0.1
PS H:\> Get-Module PowerShellGet
ModuleType Version Name ExportedCommands
---------- ------- ---- ----------------
Script 1.0.0.1 PowerShellGet {Find-Command, Find-DscResource, Find-Module, Find-RoleCapability...}
PS H:\> Find-Module DBModule -AllVersions
Version Name Repository Description
------- ---- ---------- -----------
1.1 DBModule NetworkPSRepo PowerShell wrappers for .NET Form classes
1.0 DBModule NetworkPSRepo PowerShell wrappers for .NET Form classes
A PowerShell Core 6.0 session:
PS C:\Program Files\PowerShell\6.0.1> $PSVersionTable
Name Value
---- -----
PSVersion 6.0.1
PSEdition Core
GitCommitId v6.0.1
OS Microsoft Windows 10.0.17763
Platform Win32NT
PSCompatibleVersions {1.0, 2.0, 3.0, 4.0...}
PSRemotingProtocolVersion 2.3
SerializationVersion 1.1.0.1
WSManStackVersion 3.0
PS C:\Program Files\PowerShell\6.0.1> Import-Module PowerShellGet
PS C:\Program Files\PowerShell\6.0.1> Get-Module PowerShellGet
ModuleType Version Name ExportedCommands
---------- ------- ---- ----------------
Script 2.2.4.1 PowerShellGet {Find-Command, Find-DscResource, Find-Module, Find-RoleCapability...}
PS C:\Program Files\PowerShell\6.0.1> Get-PSRepository
Name InstallationPolicy SourceLocation
---- ------------------ --------------
PSGallery Untrusted https://www.powershellgallery.com/api/v2
LocalPSRepo Trusted C:\Users\xxx\Documents\PowerShell\Local Repository\
NetworkPSRepo Trusted H:\PowerShell\Repository\
PS C:\Program Files\PowerShell\6.0.1> dir H:\PowerShell\Repository
Directory: H:\PowerShell\Repository
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a---- 5/4/2020 2:54 PM 3577 DBModule.1.0.nupkg
-a---- 5/4/2020 2:55 PM 3584 DBModule.1.1.nupkg
PS C:\Program Files\PowerShell\6.0.1> Find-Module DBModule -AllVersions
PS C:\Program Files\PowerShell\6.0.1> Find-Module DBModule -Repository NetworkPSRepo -AllVersions -Verbose
VERBOSE: Repository details, Name = 'NetworkPSRepo', Location = 'H:\PowerShell\Repository\'; IsTrusted = 'True'; IsRegistered = 'True'.
VERBOSE: Using the provider 'PowerShellGet' for searching packages.
VERBOSE: Using the specified source names : 'NetworkPSRepo'.
VERBOSE: Getting the provider object for the PackageManagement Provider 'NuGet'.
VERBOSE: The specified Location is 'H:\PowerShell\Repository\' and PackageManagementProvider is 'NuGet'.
VERBOSE: Total package yield:'2' for the specified package 'DBModule'.
PS C:\Program Files\PowerShell\6.0.1> Remove-Module PowerShellGet
PS C:\Program Files\PowerShell\6.0.1> Import-Module PowerShellGet -RequiredVersion 1.1.0.0
PS C:\Program Files\PowerShell\6.0.1> Get-Module PowerShellGet
ModuleType Version Name ExportedCommands
---------- ------- ---- ----------------
Script 1.1.0.0 PowerShellGet {Find-Command, Find-DscResource, Find-Module, Find-RoleCapability...}
PS C:\Program Files\PowerShell\6.0.1> Find-Module DBModule -AllVersions
Version Name Repository Description
------- ---- ---------- -----------
1.1 DBModule NetworkPSRepo PowerShell wrappers for .NET Form classes
1.0 DBModule NetworkPSRepo PowerShell wrappers for .NET Form classes
I came across something like this just now. Out of curiosity, does it work if you specify add -AllowPrerelease to your search? It's not likely to be fixed, but I think I found a bug here:
https://github.com/PowerShell/PowerShellGetv2/blob/8c61ce7687de813438b0698c6eb461f610aa25ca/src/PowerShellGet/public/psgetfunctions/Find-Module.ps1#L158
Specifically this part $psgetItemInfo.AdditionalMetadata.IsPrerelease -eq 'false'. For a package that isn't prerelease, I don't think the AdditionalMetadata will have an IsPrerelease property, so $psgetItemInfo.AdditionalMetadata.IsPrerelease will return $null, so it essentially boils down to $null -eq 'false' which is itself false, so it won't execute the part of the code that will return the package. So it will accidentally filter out every package unless you specify -AllowPrerelease which will then also return PreRelease packages.
Easy enough to fix, assuming my assumption that Find-Package won't set an IsPrerelease property when it's not prerelease. But I doubt it will happen since all the work is happening on v3.
For a package that isn't prerelease $psgetItemInfo.AdditionalMetadata.IsPrerelease is actually a boolean False which does not equal to the string false.
I have just suddenly hit this issue and I do not understand how this happened. Seems like PackageManagement\Find-Package version does not match that of PowerShellGet\Find-Module
In my case I have PackageManagement 1.4.7, but PowerShellGet 2.2.4.1
I do not understand why it started to happen suddenly. Some kind of an auto update.
OK, I figured out the root cause. Another script loads the latest version of PowerShellGet which overshadows the old one. But this latest version is broken! Find-Module -AllVersions is broken and the fix is trivial - just do not compare with the 'false' string! Use !$psgetItemInfo.AdditionalMetadata.IsPrerelease instead or add it as an OR clause.
Is anyone looking at this one at all! This is frustrating.
@FISHMANPET I was having the same issue with some modules I downloaded from the PSGallery using save-module and save-package. I can find-module in my local repository but only if I specify the -RequiredVersion. Using -AllowPrerelease shows me all the modules in the local repository. Thx!
I came across something like this just now. Out of curiosity, does it work if you specify add
-AllowPrereleaseto your search? It's not likely to be fixed, but I think I found a bug here:https://github.com/PowerShell/PowerShellGetv2/blob/8c61ce7687de813438b0698c6eb461f610aa25ca/src/PowerShellGet/public/psgetfunctions/Find-Module.ps1#L158
Specifically this part
$psgetItemInfo.AdditionalMetadata.IsPrerelease -eq 'false'. For a package that isn't prerelease, I don't think theAdditionalMetadatawill have anIsPrereleaseproperty, so$psgetItemInfo.AdditionalMetadata.IsPrereleasewill return$null, so it essentially boils down to$null -eq 'false'which is itself false, so it won't execute the part of the code that will return the package. So it will accidentally filter out every package unless you specify-AllowPrereleasewhich will then also return PreRelease packages. Easy enough to fix, assuming my assumption that Find-Package won't set an IsPrerelease property when it's not prerelease. But I doubt it will happen since all the work is happening on v3.
I've tested and believe that on line 158, 'false' should be replaced with $false as is done in the Find-Script.ps1 for the same functionality.
https://github.com/PowerShell/PowerShellGetv2/blob/8c61ce7687de813438b0698c6eb461f610aa25ca/src/PowerShellGet/public/psgetfunctions/Find-Script.ps1#L166
In my local repository, my packages have IsPrerelease=False, where as the ones on PSGallery seem to have IsPrerelease=false
And three years later...
Hi @DennisL68, we're no longer working on this repository, see the read me. Please try PSResourceGet for continued improvements on what was previously PowerShellGet