Add-StreamDeckAction.ps1
function Add-StreamDeckAction { <# .Synopsis Adds StreamDeck Action to Plugins. .Description Adds a StreamDeck Action to a Plugin .Example Add-StreamDeckAction -PluginPath .\MyPlugin.sdPlugin -Name MyPluginAction -Tooltip "Just the tip" -PropertyInspectorPath .\MyPropertyInspector.html .Link Get-StreamDeckAction .Link Get-StreamDeckPlugin #> [CmdletBinding(SupportsShouldProcess)] param( # The path to a StreamDeck plugin [Parameter(Mandatory,ParameterSetName='Plugin',ValueFromPipelineByPropertyName)] [string] $PluginPath, # The name of the action being added to the plugin. [Parameter(Mandatory,ParameterSetName='Plugin',ValueFromPipelineByPropertyName)] [string] $Name, # The tooltip for the plugin action. [Parameter(ParameterSetName='Plugin',ValueFromPipelineByPropertyName)] [string] $Tooltip, # The UUID for the plugin action. [Parameter(ParameterSetName='Plugin',ValueFromPipelineByPropertyName)] [string] $UUID, # The icon for the plugin action. [Parameter(ParameterSetName='Plugin',ValueFromPipelineByPropertyName)] [string] $Icon, # One or more states for the plugin action. [Parameter(ParameterSetName='Plugin',ValueFromPipelineByPropertyName)] [Alias('States')] [PSObject[]] $State, # The relative path to the property inspector for the plugin action. [Parameter(ParameterSetName='Plugin',ValueFromPipelineByPropertyName)] [string] $PropertyInspectorPath, # If not explicitly set to false, the plugin action will be supported within MultiActions [Parameter(ParameterSetName='Plugin',ValueFromPipelineByPropertyName)] [switch] $SupportedInMultiAction = $true ) process { $pluginFound = Get-StreamDeckPlugin -PluginPath $PluginPath if (-not $pluginFound) { Write-Error "No Plugin found beneath '$pluginPath'" return } if (-not $PSBoundParameters['UUID']) { $uuid = $PSBoundParameters['UUID'] = $pluginFound.Name + '.' + $PSBoundParameters['Name'] } $paramCopy = [Ordered]@{} + $PSBoundParameters $paramCopy.Remove('PluginPath') $currentPlugin = Get-Content -LiteralPath $pluginFound.PluginPath -Raw | ConvertFrom-Json $actionExists = $currentPlugin.actions | Where-Object UUID -eq $UUID $currentPlugin.actions = if ($actionExists) { @($currentPlugin.actions | Where-Object UUID -NE $UUID) + [PSCustomObject]$paramCopy } else { @() + $currentPlugin.actions + [PSCustomObject]$paramCopy } if ($PSCmdlet.ShouldProcess("Update Plugin $($PluginPath)")) { $currentPlugin | ConvertTo-Json -Depth 100 | Set-content -LiteralPath $pluginFound.PluginPath } } } |