Remove-WTProfile.ps1
function Remove-WTProfile { <# .Synopsis Removes a Windows Terminal Profile .Description Removes Windows Terminal Profiles, or removes one or more -Property from a Windows Terminal profile. .Example Add-WTProfile -Name 'DOS' -CommandLine cmd # Add a DOS profile Remove-WTProfile -Name DOS # and get rid of it. .Link Add-WTProfile #> [CmdletBinding(SupportsShouldProcess,ConfirmImpact='High',DefaultParameterSetName='SpecificProfile')] [OutputType([PSObject])] param( # The name of the profile. [Parameter(Mandatory,ParameterSetName='SpecificProfile',ValueFromPipelineByPropertyName)] [Alias('Name')] [string[]] $ProfileName, # If -Default is present with no other parameters, clears the default profile settings. # If -Property is also present, removes properties from the default profile settings. [Parameter(Mandatory,ParameterSetName='DefaultProfile',ValueFromPipelineByPropertyName)] [Alias('Defaults')] [switch] $Default, # The name of one or more properties to remove from a profile. [Parameter(ValueFromPipelineByPropertyName)] [Alias('Properties','PropertyName','PropertyNames')] [string[]] $Property ) process { $wtProfile = Get-WTProfile -Global $targetProfiles = @(if ($Default) { $wtProfile.profiles.defaults } else { Get-WTProfile -ProfileName $ProfileName }) if (-not $targetProfiles) { return } #region Removing Profiles if (-not $Property) # If no property was provided, we're removing whole profiles { if (-not $wtProfile.profiles) { $wtProfile | Add-Member NoteProperty profiles ([PSCustomObject]@{list=@();defaults=[PSObject]::new()}) -Force } if ($Default) { # If we're "removing" the default profile, clear it $wtProfile.profiles | Add-Member NoteProperty defaults ([PSObject]::new()) -Force } else { $targetProfilesGuids = # Find all of the target GUIDs $targetProfiles | Select-Object -ExpandProperty GUID if ($null -eq $wtProfile.profiles.list) { $wtProfile.profiles | Add-Member NoteProperty list @() -Force } $wtProfile.profiles.list = # reassign the profiles property to be @( # a list foreach ($prof in $wtProfile.profiles.list) { # containing profiles that were not if ($targetProfilesGuids -notcontains # one of the target guids. $prof.GUID) { $prof } } ) } } #endregion Removing Profiles #region Removing Properties else { # To remove properties within target profiles foreach ($prof in $targetProfiles) # we need to walk each target profile. { # Then walk over each property. :NextProfileProperty # We'll label this loop :NextProfileProperty for performancce. foreach ($prop in @($prof.psobject.properties)) { # Then we have to walk over each -Property, since they could be wildcards. foreach ($p in $Property) { if ($prop.Name -like $p) { # When the wildcard matches $prof | Add-Member NoteProperty $prop.Name '' -Force # make it blank so that # Set-WTProfile will remove the property. continue NextProfileProperty # then continue to the next profile property. } } } if ($prof.guid) { $prof | Set-WTProfile } else { $prof | Set-WTProfile -Default } } return } #endregion Removing Properties #region Updating Settings # Now that we've changed our object, let's update the settings if ($PSCmdlet.ShouldProcess("Update $($wtProfile.Path)")) { $wtPath = $wtProfile.Path $wtProfile.psobject.properties.Remove('Path') $wtProfile | ConvertTo-Json -Depth 100 | Set-Content -LiteralPath $wtPath -Force -Encoding UTF8 $wtProfile.psobject.properties.add([PSNoteProperty]::new('Path', $wtPath)) } #endregion Updating Settings if ($WhatIfPreference -or $PassThru) { if ($Property) { foreach ($prof in $targetProfiles) { $prof } } else { $wtProfile } } } } |