private/ConvertTo-SoftwareIdentity.ps1
# Convert the output from choco.exe into Software Identities (SWIDs). # We do this by pattern matching the output for anything that looks like it contains the package we were looking for, and a version. # Chocolatey doesn't return source information in its packge output, so we have to inject source information based on what the user requested. # If a custom source isn't specified, default to using Chocolatey.org. function ConvertTo-SoftwareIdentity { [CmdletBinding()] param ( [Parameter(ValueFromPipeline)] [string[]] $ChocoOutput, [Parameter()] [string] $RequestedName, [Parameter()] [string] $Source = $script:PackageSourceName ) begin { $packageRegex = "^(?<name>[\S]+)[\|\s](?<version>[\S]+)" $packageReportRegex="^[0-9]*(\s*)(packages installed)" } process { # Each line we get from choco.exe isnt necessarily a package, but it could be foreach ($packageCandidate in $ChocoOutput) { if (($packageCandidate -Match $packageRegex) -and ($packageCandidate -notmatch $packageReportRegex) -and $Matches.name -and $Matches.version) { # If a particular package name wasnt queried for by the user, return everything that choco does if (-not ($RequestedName) -or (Test-PackageName -RequestedName $RequestedName -PackageName $Matches.name)) { # Return a new SWID based on the output from choco Write-Debug "Package identified: $($Matches.name), $($Matches.version)" $swid = @{ FastPackageReference = $Matches.name+"#"+ $Matches.version.TrimStart('v')+"#"+$Source Name = $Matches.name Version = $Matches.version.TrimStart('v') versionScheme = "MultiPartNumeric" FromTrustedSource = $true Source = $Source } New-SoftwareIdentity @swid } } } } } |