functions/Add-CmdFav.ps1
function Add-CmdFav { <# .SYNOPSIS Adds a favorite command to a cache for future use. .DESCRIPTION The Add-CmdFav function allows you to add a favorite command to a cache, making it easily accessible for future use. You can specify a custom name, command line, tags, and choose whether to use the last executed command as the favorite. .PARAMETER Name Specifies the name of the favorite command. This parameter is mandatory. .PARAMETER CommandLine Specifies the command line to be associated with the favorite. This parameter is mandatory unless -LastCommand is used. .PARAMETER Description The description of the command .PARAMETER LastCommand Indicates that the last executed command should be used as the favorite command line. If this switch is used, the CommandLine parameter is ignored. .PARAMETER Tag Specifies tags to help categorize and organize the favorite commands. .PARAMETER Id The Id from Get-History from the commands to be used .PARAMETER Force Forces overwriting an existing favorite with the same name. .EXAMPLE Add-CmdFav -Name "MyFavorite" -CommandLine "Get-Process" -Tag "Monitoring" Adds a favorite command named "MyFavorite" with the command line "Get-Process" and a tag "Monitoring" to the cache. .EXAMPLE Add-CmdFav -Name "LastCommandFavorite" -LastCommand -Tag "Recent" Adds a favorite command named "LastCommandFavorite" with the last executed command line and a tag "Recent" to the cache. .EXAMPLE Get-History -Id 22 -Count 2|Add-CmdFav -Name "ScriptblockFromHistory" Adds a favorite command named "ScriptblockFromHistory" with the executed command lines 21-22 from the command history .EXAMPLE Get-History -Id 22,23,26 | Add-CmdFav -Name "MultiLineByPipe" Add-CmdFav -Name "MultiLineById" -Id 22,23,26 Adds favorite commands with the command lines 22-23,26 from the command history .NOTES #> [CmdletBinding(DefaultParameterSetName='Direct')] param ( [parameter(mandatory = $true, Position = 1)] [string]$Name, [parameter(mandatory = $true, ParameterSetName = 'Direct', ValueFromPipelineByPropertyName = $true)] $CommandLine, [parameter(mandatory = $true, ParameterSetName = 'LastCommand')] [switch]$LastCommand, [parameter(mandatory = $true, ParameterSetName = 'HistoryID')] [int[]]$Id, [PSFramework.TabExpansion.PsfArgumentCompleterAttribute("CmdFav.Tags")] [string[]]$Tag, [string]$Description, [switch]$Force ) begin { $cmdCache = Get-PSFConfigValue -FullName 'CmdFav.History' -Fallback @() if (-not $cmdCache) { $cmdCache = @() } $prevFav = ($cmdCache | Where-Object name -eq $Name) if ($prevFav) { if ($force) { Write-PSFMessage "Overwriting Favorite, previos command: $($prevFav.CommandLine)" $cmdCache = $cmdCache | Where-Object name -ne $Name } else { Stop-PSFFunction -Level Warning -Message "Favorite Name '$Name' already exists, -Force not used, does not overwrite" } } $newEntry = $PSBoundParameters | ConvertTo-PSFHashtable -IncludeEmpty -Include Name, CommandLine, Tag, Description $scriptBlockBuilder = [System.Text.StringBuilder]::new() $commandArray=@() If ($PsCmdlet.ParameterSetName -eq 'LastCommand') { $commandArray += (Get-History -Count 1 | select-object -ExpandProperty CommandLine) } } process { if (Test-PSFFunctionInterrupt) { return } $commandArray+=$CommandLine } end { if (Test-PSFFunctionInterrupt) { return } if ($PsCmdlet.ParameterSetName -eq 'HistoryID') { Write-PSFMessage "Searching History by Id" $commandArray+=(Get-History -Id $Id).CommandLine } Write-PSFMessage "`$commandArray=$commandArray" foreach($cmd in $commandArray){ if ($scriptBlockBuilder.Length -gt 0) { [void]$scriptBlockBuilder.AppendLine() } [void]$scriptBlockBuilder.Append($cmd) } $newEntry.CommandLine = $scriptBlockBuilder.ToString() Write-PSFMessage "Adding $($newEntry | ConvertTo-Json -Compress) to the cache" ([array]$cmdCache) += [PSCustomObject]$newEntry $cmdCache = [array]$cmdCache Write-PSFMessage "Saving cache to configuration framework" Set-PSFConfig -Module 'CmdFav' -Name 'History' -Value ($cmdCache) -AllowDelete -PassThru | Register-PSFConfig -Scope FileUserShared } } Set-Alias -Name "acf" -Value "Add-CmdFav" |