Cobalt.psm1
# Module created by Microsoft.PowerShell.Crescendo Function Get-WinGetSource { [CmdletBinding()] param( [Parameter()] [string]$Name ) BEGIN { $__PARAMETERMAP = @{ Name = @{ OriginalName = '--name='; OriginalPosition = '0'; Position = '2147483647'; ParameterType = [string]; NoGap = $True } } $__outputHandlers = @{ Default = @{ StreamOutput = $False; Handler = { param ($output) if ($output) { $output | ConvertFrom-Json } } } } } PROCESS { $__commandArgs = @( "source" "export" ) $__boundparms = $PSBoundParameters $MyInvocation.MyCommand.Parameters.Values.Where({$_.SwitchParameter -and $_.Name -notmatch "Debug|Whatif|Confirm|Verbose" -and ! $PSBoundParameters[$_.Name]}).ForEach({$PSBoundParameters[$_.Name] = [switch]::new($false)}) if ($PSBoundParameters["Debug"]){wait-debugger} foreach ($paramName in $PSBoundParameters.Keys|Sort-Object {$__PARAMETERMAP[$_].OriginalPosition}) { $value = $PSBoundParameters[$paramName] $param = $__PARAMETERMAP[$paramName] if ($param) { if ( $value -is [switch] ) { $__commandArgs += if ( $value.IsPresent ) { $param.OriginalName } else { $param.DefaultMissingValue } } elseif ( $param.NoGap ) { $__commandArgs += "{0}""{1}""" -f $param.OriginalName, $value } else { $__commandArgs += $param.OriginalName; $__commandArgs += $value |Foreach-Object {$_}} } } $__commandArgs = $__commandArgs|Where-Object {$_} if ($PSBoundParameters["Debug"]){wait-debugger} if ( $PSBoundParameters["Verbose"]) { Write-Verbose -Verbose -Message WinGet $__commandArgs | Write-Verbose -Verbose } $__handlerInfo = $__outputHandlers[$PSCmdlet.ParameterSetName] if (! $__handlerInfo ) { $__handlerInfo = $__outputHandlers["Default"] # Guaranteed to be present } $__handler = $__handlerInfo.Handler if ( $PSCmdlet.ShouldProcess("WinGet")) { if ( $__handlerInfo.StreamOutput ) { & "WinGet" $__commandArgs | & $__handler } else { $result = & "WinGet" $__commandArgs & $__handler $result } } } # end PROCESS <# .DESCRIPTION Return WinGet package sources .PARAMETER Name Source Name #> } Function Register-WinGetSource { [CmdletBinding()] param( [Parameter(Mandatory=$true)] [string]$Name, [Parameter(Mandatory=$true)] [string]$Argument ) BEGIN { $__PARAMETERMAP = @{ Name = @{ OriginalName = '--name='; OriginalPosition = '0'; Position = '2147483647'; ParameterType = [string]; NoGap = $True } Argument = @{ OriginalName = '--arg='; OriginalPosition = '0'; Position = '2147483647'; ParameterType = [string]; NoGap = $True } } $__outputHandlers = @{ Default = @{ StreamOutput = $False; Handler = { param ($output) if ($output) { if ($output[-1] -ne 'Done') { Write-Error ($output -join "`r`n") } } } } } } PROCESS { $__commandArgs = @( "source" "add" ) $__boundparms = $PSBoundParameters $MyInvocation.MyCommand.Parameters.Values.Where({$_.SwitchParameter -and $_.Name -notmatch "Debug|Whatif|Confirm|Verbose" -and ! $PSBoundParameters[$_.Name]}).ForEach({$PSBoundParameters[$_.Name] = [switch]::new($false)}) if ($PSBoundParameters["Debug"]){wait-debugger} foreach ($paramName in $PSBoundParameters.Keys|Sort-Object {$__PARAMETERMAP[$_].OriginalPosition}) { $value = $PSBoundParameters[$paramName] $param = $__PARAMETERMAP[$paramName] if ($param) { if ( $value -is [switch] ) { $__commandArgs += if ( $value.IsPresent ) { $param.OriginalName } else { $param.DefaultMissingValue } } elseif ( $param.NoGap ) { $__commandArgs += "{0}""{1}""" -f $param.OriginalName, $value } else { $__commandArgs += $param.OriginalName; $__commandArgs += $value |Foreach-Object {$_}} } } $__commandArgs = $__commandArgs|Where-Object {$_} if ($PSBoundParameters["Debug"]){wait-debugger} if ( $PSBoundParameters["Verbose"]) { Write-Verbose -Verbose -Message WinGet $__commandArgs | Write-Verbose -Verbose } $__handlerInfo = $__outputHandlers[$PSCmdlet.ParameterSetName] if (! $__handlerInfo ) { $__handlerInfo = $__outputHandlers["Default"] # Guaranteed to be present } $__handler = $__handlerInfo.Handler if ( $PSCmdlet.ShouldProcess("WinGet")) { if ( $__handlerInfo.StreamOutput ) { & "WinGet" $__commandArgs | & $__handler } else { $result = & "WinGet" $__commandArgs & $__handler $result } } } # end PROCESS <# .DESCRIPTION Register a new WinGet package source .PARAMETER Name Source Name .PARAMETER Argument Source Argument #> } Function Unregister-WinGetSource { [CmdletBinding()] param( [Parameter(ValueFromPipelineByPropertyName=$true,Mandatory=$true)] [string]$Name ) BEGIN { $__PARAMETERMAP = @{ Name = @{ OriginalName = '--name='; OriginalPosition = '0'; Position = '2147483647'; ParameterType = [string]; NoGap = $True } } $__outputHandlers = @{ Default = @{ StreamOutput = $False; Handler = { param ($output) if ($output) { if ($output[-1] -match 'Did not find a source') { Write-Error ($output -join "`r`n") } } } } } } PROCESS { $__commandArgs = @( "source" "remove" ) $__boundparms = $PSBoundParameters $MyInvocation.MyCommand.Parameters.Values.Where({$_.SwitchParameter -and $_.Name -notmatch "Debug|Whatif|Confirm|Verbose" -and ! $PSBoundParameters[$_.Name]}).ForEach({$PSBoundParameters[$_.Name] = [switch]::new($false)}) if ($PSBoundParameters["Debug"]){wait-debugger} foreach ($paramName in $PSBoundParameters.Keys|Sort-Object {$__PARAMETERMAP[$_].OriginalPosition}) { $value = $PSBoundParameters[$paramName] $param = $__PARAMETERMAP[$paramName] if ($param) { if ( $value -is [switch] ) { $__commandArgs += if ( $value.IsPresent ) { $param.OriginalName } else { $param.DefaultMissingValue } } elseif ( $param.NoGap ) { $__commandArgs += "{0}""{1}""" -f $param.OriginalName, $value } else { $__commandArgs += $param.OriginalName; $__commandArgs += $value |Foreach-Object {$_}} } } $__commandArgs = $__commandArgs|Where-Object {$_} if ($PSBoundParameters["Debug"]){wait-debugger} if ( $PSBoundParameters["Verbose"]) { Write-Verbose -Verbose -Message WinGet $__commandArgs | Write-Verbose -Verbose } $__handlerInfo = $__outputHandlers[$PSCmdlet.ParameterSetName] if (! $__handlerInfo ) { $__handlerInfo = $__outputHandlers["Default"] # Guaranteed to be present } $__handler = $__handlerInfo.Handler if ( $PSCmdlet.ShouldProcess("WinGet")) { if ( $__handlerInfo.StreamOutput ) { & "WinGet" $__commandArgs | & $__handler } else { $result = & "WinGet" $__commandArgs & $__handler $result } } } # end PROCESS <# .DESCRIPTION Unegister an existing WinGet package source .PARAMETER Name Source Name #> } Function Install-WinGetPackage { [CmdletBinding()] param( [Parameter(ValueFromPipelineByPropertyName=$true)] [string]$ID, [Parameter()] [switch]$Exact, [Parameter(ValueFromPipelineByPropertyName=$true)] [string]$Source, [Parameter(ValueFromPipelineByPropertyName=$true)] [string]$Version ) BEGIN { $__PARAMETERMAP = @{ ID = @{ OriginalName = '--id='; OriginalPosition = '0'; Position = '2147483647'; ParameterType = [string]; NoGap = $True } Exact = @{ OriginalName = '--exact'; OriginalPosition = '0'; Position = '2147483647'; ParameterType = [switch]; NoGap = $False } Source = @{ OriginalName = '--source='; OriginalPosition = '0'; Position = '2147483647'; ParameterType = [string]; NoGap = $True } Version = @{ OriginalName = '--version='; OriginalPosition = '0'; Position = '2147483647'; ParameterType = [string]; NoGap = $True } } $__outputHandlers = @{ Default = @{ StreamOutput = $False; Handler = { param ($output) if ($output) { if ($output -match 'failed') { Write-Error ($output -join "`r`n") } else { $output | ForEach-Object { if ($_ -match '\[(?<id>[\S]+)\] Version (?<version>[\S]+)' -and $Matches.id -and $Matches.version) { [pscustomobject]@{ ID = $Matches.id Version = $Matches.version } } } } } } } } } PROCESS { $__commandArgs = @( "install" "--accept-package-agreements" "--accept-source-agreements" "--silent" ) $__boundparms = $PSBoundParameters $MyInvocation.MyCommand.Parameters.Values.Where({$_.SwitchParameter -and $_.Name -notmatch "Debug|Whatif|Confirm|Verbose" -and ! $PSBoundParameters[$_.Name]}).ForEach({$PSBoundParameters[$_.Name] = [switch]::new($false)}) if ($PSBoundParameters["Debug"]){wait-debugger} foreach ($paramName in $PSBoundParameters.Keys|Sort-Object {$__PARAMETERMAP[$_].OriginalPosition}) { $value = $PSBoundParameters[$paramName] $param = $__PARAMETERMAP[$paramName] if ($param) { if ( $value -is [switch] ) { $__commandArgs += if ( $value.IsPresent ) { $param.OriginalName } else { $param.DefaultMissingValue } } elseif ( $param.NoGap ) { $__commandArgs += "{0}""{1}""" -f $param.OriginalName, $value } else { $__commandArgs += $param.OriginalName; $__commandArgs += $value |Foreach-Object {$_}} } } $__commandArgs = $__commandArgs|Where-Object {$_} if ($PSBoundParameters["Debug"]){wait-debugger} if ( $PSBoundParameters["Verbose"]) { Write-Verbose -Verbose -Message WinGet $__commandArgs | Write-Verbose -Verbose } $__handlerInfo = $__outputHandlers[$PSCmdlet.ParameterSetName] if (! $__handlerInfo ) { $__handlerInfo = $__outputHandlers["Default"] # Guaranteed to be present } $__handler = $__handlerInfo.Handler if ( $PSCmdlet.ShouldProcess("WinGet")) { if ( $__handlerInfo.StreamOutput ) { & "WinGet" $__commandArgs | & $__handler } else { $result = & "WinGet" $__commandArgs & $__handler $result } } } # end PROCESS <# .DESCRIPTION Install a new package with WinGet .PARAMETER ID Package ID .PARAMETER Exact Search by exact package name .PARAMETER Source Package Source .PARAMETER Version Package Version #> } Function Get-WinGetPackage { [CmdletBinding()] param( [Parameter(ValueFromPipelineByPropertyName=$true)] [string]$ID, [Parameter()] [switch]$Exact, [Parameter(ValueFromPipelineByPropertyName=$true)] [string]$Source ) BEGIN { $__PARAMETERMAP = @{ ID = @{ OriginalName = '--id='; OriginalPosition = '0'; Position = '2147483647'; ParameterType = [string]; NoGap = $True } Exact = @{ OriginalName = '--exact'; OriginalPosition = '0'; Position = '2147483647'; ParameterType = [switch]; NoGap = $False } Source = @{ OriginalName = '--source='; OriginalPosition = '0'; Position = '2147483647'; ParameterType = [string]; NoGap = $True } } $__outputHandlers = @{ Default = @{ StreamOutput = $False; Handler = { param ( $output ) $headerLine = $output.IndexOf(($output -Match '^Name' | Select-Object -First 1)) if ($headerLine -ne -1) { $idIndex = $output[$headerLine].IndexOf('Id') $versionIndex = $output[$headerLine].IndexOf('Version') $availableIndex = $output[$headerLine].IndexOf('Available') $sourceIndex = $output[$headerLine].IndexOf('Source') # Take into account WinGet's dynamic columnar output formatting $versionEndIndex = $( if ($availableIndex -ne -1) { $availableIndex } else { $sourceIndex } ) $output -replace '[^i\p{IsBasicLatin}]',' ' | Select-Object -Skip ($headerLine+2) | ForEach-Object { $package = [ordered]@{ ID = $_.SubString($idIndex,$versionIndex-$idIndex).Trim() Version = $_.SubString($versionIndex,$versionEndIndex-$versionIndex).Trim() -replace '[^\.\d]' } # More dynamic columnar output formatting if (($sourceIndex -ne -1) -And ($_.Length -ge $sourceIndex)) { $package.Source = $_.SubString($sourceIndex).Trim() -split ' ' | Select-Object -Last 1 } [pscustomobject]$package } } } } } } PROCESS { $__commandArgs = @( "list" "--accept-source-agreements" ) $__boundparms = $PSBoundParameters $MyInvocation.MyCommand.Parameters.Values.Where({$_.SwitchParameter -and $_.Name -notmatch "Debug|Whatif|Confirm|Verbose" -and ! $PSBoundParameters[$_.Name]}).ForEach({$PSBoundParameters[$_.Name] = [switch]::new($false)}) if ($PSBoundParameters["Debug"]){wait-debugger} foreach ($paramName in $PSBoundParameters.Keys|Sort-Object {$__PARAMETERMAP[$_].OriginalPosition}) { $value = $PSBoundParameters[$paramName] $param = $__PARAMETERMAP[$paramName] if ($param) { if ( $value -is [switch] ) { $__commandArgs += if ( $value.IsPresent ) { $param.OriginalName } else { $param.DefaultMissingValue } } elseif ( $param.NoGap ) { $__commandArgs += "{0}""{1}""" -f $param.OriginalName, $value } else { $__commandArgs += $param.OriginalName; $__commandArgs += $value |Foreach-Object {$_}} } } $__commandArgs = $__commandArgs|Where-Object {$_} if ($PSBoundParameters["Debug"]){wait-debugger} if ( $PSBoundParameters["Verbose"]) { Write-Verbose -Verbose -Message WinGet $__commandArgs | Write-Verbose -Verbose } $__handlerInfo = $__outputHandlers[$PSCmdlet.ParameterSetName] if (! $__handlerInfo ) { $__handlerInfo = $__outputHandlers["Default"] # Guaranteed to be present } $__handler = $__handlerInfo.Handler if ( $PSCmdlet.ShouldProcess("WinGet")) { if ( $__handlerInfo.StreamOutput ) { & "WinGet" $__commandArgs | & $__handler } else { $result = & "WinGet" $__commandArgs & $__handler $result } } } # end PROCESS <# .DESCRIPTION Get a list of installed WinGet packages .PARAMETER ID Package ID .PARAMETER Exact Search by exact package name .PARAMETER Source Package Source #> } Function Find-WinGetPackage { [CmdletBinding()] param( [Parameter(ValueFromPipelineByPropertyName=$true)] [string]$ID, [Parameter()] [switch]$Exact, [Parameter(ValueFromPipelineByPropertyName=$true)] [string]$Source ) BEGIN { $__PARAMETERMAP = @{ ID = @{ OriginalName = '--id='; OriginalPosition = '0'; Position = '2147483647'; ParameterType = [string]; NoGap = $True } Exact = @{ OriginalName = '--exact'; OriginalPosition = '0'; Position = '2147483647'; ParameterType = [switch]; NoGap = $False } Source = @{ OriginalName = '--source='; OriginalPosition = '0'; Position = '2147483647'; ParameterType = [string]; NoGap = $True } } $__outputHandlers = @{ Default = @{ StreamOutput = $False; Handler = { param ( $output ) $headerLine = $output.IndexOf(($output -Match '^Name' | Select-Object -First 1)) if ($headerLine -ne -1) { $idIndex = $output[$headerLine].IndexOf('Id') $versionIndex = $output[$headerLine].IndexOf('Version') $availableIndex = $output[$headerLine].IndexOf('Available') $sourceIndex = $output[$headerLine].IndexOf('Source') # Take into account WinGet's dynamic columnar output formatting $versionEndIndex = $( if ($availableIndex -ne -1) { $availableIndex } else { $sourceIndex } ) $output -replace '[^i\p{IsBasicLatin}]',' ' | Select-Object -Skip ($headerLine+2) | ForEach-Object { $package = [ordered]@{ ID = $_.SubString($idIndex,$versionIndex-$idIndex).Trim() Version = $_.SubString($versionIndex,$versionEndIndex-$versionIndex).Trim() -replace '[^\.\d]' } # More dynamic columnar output formatting if (($sourceIndex -ne -1) -And ($_.Length -ge $sourceIndex)) { $package.Source = $_.SubString($sourceIndex).Trim() -split ' ' | Select-Object -Last 1 } [pscustomobject]$package } } } } } } PROCESS { $__commandArgs = @( "search" "--accept-source-agreements" ) $__boundparms = $PSBoundParameters $MyInvocation.MyCommand.Parameters.Values.Where({$_.SwitchParameter -and $_.Name -notmatch "Debug|Whatif|Confirm|Verbose" -and ! $PSBoundParameters[$_.Name]}).ForEach({$PSBoundParameters[$_.Name] = [switch]::new($false)}) if ($PSBoundParameters["Debug"]){wait-debugger} foreach ($paramName in $PSBoundParameters.Keys|Sort-Object {$__PARAMETERMAP[$_].OriginalPosition}) { $value = $PSBoundParameters[$paramName] $param = $__PARAMETERMAP[$paramName] if ($param) { if ( $value -is [switch] ) { $__commandArgs += if ( $value.IsPresent ) { $param.OriginalName } else { $param.DefaultMissingValue } } elseif ( $param.NoGap ) { $__commandArgs += "{0}""{1}""" -f $param.OriginalName, $value } else { $__commandArgs += $param.OriginalName; $__commandArgs += $value |Foreach-Object {$_}} } } $__commandArgs = $__commandArgs|Where-Object {$_} if ($PSBoundParameters["Debug"]){wait-debugger} if ( $PSBoundParameters["Verbose"]) { Write-Verbose -Verbose -Message WinGet $__commandArgs | Write-Verbose -Verbose } $__handlerInfo = $__outputHandlers[$PSCmdlet.ParameterSetName] if (! $__handlerInfo ) { $__handlerInfo = $__outputHandlers["Default"] # Guaranteed to be present } $__handler = $__handlerInfo.Handler if ( $PSCmdlet.ShouldProcess("WinGet")) { if ( $__handlerInfo.StreamOutput ) { & "WinGet" $__commandArgs | & $__handler } else { $result = & "WinGet" $__commandArgs & $__handler $result } } } # end PROCESS <# .DESCRIPTION Find a list of available WinGet packages .PARAMETER ID Package ID .PARAMETER Exact Search by exact package name .PARAMETER Source Package Source #> } Function Uninstall-WinGetPackage { [CmdletBinding()] param( [Parameter(ValueFromPipelineByPropertyName=$true)] [string]$ID, [Parameter()] [switch]$Exact, [Parameter(ValueFromPipelineByPropertyName=$true)] [string]$Source ) BEGIN { $__PARAMETERMAP = @{ ID = @{ OriginalName = '--id='; OriginalPosition = '0'; Position = '2147483647'; ParameterType = [string]; NoGap = $True } Exact = @{ OriginalName = '--exact'; OriginalPosition = '0'; Position = '2147483647'; ParameterType = [switch]; NoGap = $False } Source = @{ OriginalName = '--source='; OriginalPosition = '0'; Position = '2147483647'; ParameterType = [string]; NoGap = $True } } $__outputHandlers = @{ Default = @{ StreamOutput = $False; Handler = { param ($output) } } } } PROCESS { $__commandArgs = @( "uninstall" "--accept-source-agreements" "--silent" ) $__boundparms = $PSBoundParameters $MyInvocation.MyCommand.Parameters.Values.Where({$_.SwitchParameter -and $_.Name -notmatch "Debug|Whatif|Confirm|Verbose" -and ! $PSBoundParameters[$_.Name]}).ForEach({$PSBoundParameters[$_.Name] = [switch]::new($false)}) if ($PSBoundParameters["Debug"]){wait-debugger} foreach ($paramName in $PSBoundParameters.Keys|Sort-Object {$__PARAMETERMAP[$_].OriginalPosition}) { $value = $PSBoundParameters[$paramName] $param = $__PARAMETERMAP[$paramName] if ($param) { if ( $value -is [switch] ) { $__commandArgs += if ( $value.IsPresent ) { $param.OriginalName } else { $param.DefaultMissingValue } } elseif ( $param.NoGap ) { $__commandArgs += "{0}""{1}""" -f $param.OriginalName, $value } else { $__commandArgs += $param.OriginalName; $__commandArgs += $value |Foreach-Object {$_}} } } $__commandArgs = $__commandArgs|Where-Object {$_} if ($PSBoundParameters["Debug"]){wait-debugger} if ( $PSBoundParameters["Verbose"]) { Write-Verbose -Verbose -Message WinGet $__commandArgs | Write-Verbose -Verbose } $__handlerInfo = $__outputHandlers[$PSCmdlet.ParameterSetName] if (! $__handlerInfo ) { $__handlerInfo = $__outputHandlers["Default"] # Guaranteed to be present } $__handler = $__handlerInfo.Handler if ( $PSCmdlet.ShouldProcess("WinGet")) { if ( $__handlerInfo.StreamOutput ) { & "WinGet" $__commandArgs | & $__handler } else { $result = & "WinGet" $__commandArgs & $__handler $result } } } # end PROCESS <# .DESCRIPTION Uninstall an existing package with WinGet .PARAMETER ID Package ID .PARAMETER Exact Search by exact package name .PARAMETER Source Package Source #> } Export-ModuleMember -Function Get-WinGetSource, Register-WinGetSource, Unregister-WinGetSource, Install-WinGetPackage, Get-WinGetPackage, Find-WinGetPackage, Uninstall-WinGetPackage |