functions/public/Remove-PSWorkItemArchive.ps1
Function Remove-PSWorkItemArchive { [cmdletbinding(SupportsShouldProcess, DefaultParameterSetName = 'id')] [alias('rwi')] [outputType('None')] Param( [Parameter( Position = 0, Mandatory, HelpMessage = 'The archive work item ID.', ValueFromPipelineByPropertyName, ParameterSetName = 'id' )] [ValidateNotNullOrEmpty()] [int]$ID, [Parameter( HelpMessage = 'The name of the archive work item. Wildcards are supported.', ParameterSetName = 'name' )] [ValidateNotNullOrEmpty()] [SupportsWildcards()] [alias('task')] [String]$Name, [Parameter( HelpMessage = 'The path to the PSWorkItem SQLite database file. It must end in .db' )] [ValidatePattern('\.db$')] [ValidateScript( { Test-Path $_ }, ErrorMessage = 'Could not validate the database path.' )] [String]$Path = $PSWorkItemPath ) DynamicParam { # Added 26 Sept 2023 to support dynamic categories based on path if (-Not $PSBoundParameters.ContainsKey('Path')) { $Path = $global:PSWorkItemPath } If (Test-Path $Path) { $paramDictionary = New-Object -Type System.Management.Automation.RuntimeDefinedParameterDictionary # Defining parameter attributes $attributeCollection = New-Object -Type System.Collections.ObjectModel.Collection[System.Attribute] $attributes = New-Object System.Management.Automation.ParameterAttribute $attributes.ParameterSetName = 'Category' $attributes.Mandatory = $True $attributes.HelpMessage = 'Removed archived PSWorkItems by the selected category' # Adding ValidateSet parameter validation #only get categories used in the Archive table #It is possible categories might be entered in different cases in the database [string[]]$value = (Get-PSWorkItemData -Table Categories -Path $Path).Category | ForEach-Object { [CultureInfo]::CurrentCulture.TextInfo.ToTitleCase($_) } | Select-Object -Unique | Sort-Object $v = New-Object System.Management.Automation.ValidateSetAttribute($value) $AttributeCollection.Add($v) # Adding ValidateNotNullOrEmpty parameter validation $v = New-Object System.Management.Automation.ValidateNotNullOrEmptyAttribute $AttributeCollection.Add($v) $attributeCollection.Add($attributes) # Defining the runtime parameter $dynParam1 = New-Object -Type System.Management.Automation.RuntimeDefinedParameter('Category', [String], $attributeCollection) $paramDictionary.Add('Category', $dynParam1) return $paramDictionary } # end if } #end DynamicParam Begin { StartTimer $PSDefaultParameterValues['_verbose:Command'] = $MyInvocation.MyCommand $PSDefaultParameterValues['_verbose:block'] = 'Begin' _verbose -message $strings.Starting if ($MyInvocation.CommandOrigin -eq 'Runspace') { #Hide this metadata when the command is called from another command _verbose -message ($strings.PSVersion -f $PSVersionTable.PSVersion) _verbose -message ($strings.UsingHost -f $host.Name) _verbose -message ($strings.UsingOS -f $PSVersionTable.OS) _verbose -message ($strings.UsingModule -f $ModuleVersion) _verbose -message ($strings.UsingDB -f $path) _verbose ($strings.DetectedCulture -f (Get-Culture)) } Write-Debug "[$((Get-Date).TimeOfDay) BEGIN ] $($MyInvocation.MyCommand): PSBoundParameters" $PSBoundParameters | Out-String | Write-Debug _verbose $strings.OpenDBConnection Try { $conn = Open-MySQLiteDB -Path $Path -ErrorAction Stop $conn | Out-String | Write-Debug } Catch { Throw "$($MyInvocation.MyCommand): $($strings.FailToOpen -f $Path)" } #parameters to splat to Invoke-MySQLiteQuery $splat = @{ Connection = $conn KeepAlive = $true Query = '' } } #begin Process { Switch ($PSCmdlet.ParameterSetName) { 'id' { _verbose -message ($strings.RemoveArchivedTask -f $ID) $splat.query = "SELECT * FROM archive WHERE id = '$ID'" $warn = ($strings.FailedToFindArchiveID -f $ID) } 'category' { $Category = $PSBoundParameters['Category'] _verbose -message ($strings.RemoveArchivedTaskCategory -f $Category) $splat.query = "SELECT * FROM archive WHERE category = '$Category' collate nocase" $warn = ($strings.FailedToFindArchiveCategory -f $Category) } 'name' { _verbose -message ($strings.RemoveArchivedTaskName -f $Name) if ($Name -match '\*') { $Name = $name.replace('*', '%') } $splat.query = "SELECT * FROM archive WHERE name like '$name' collate nocase" $warn = ($strings.FailedToFindArchiveName -f $Name) } } _verbose -message $splat.query $tasks = Invoke-MySQLiteQuery @splat if ($tasks.taskid) { #An older database that was upgraded might have multiple items #with the same ID foreach ($task in $tasks) { $splat.query = "DELETE FROM archive WHERE taskid = '$($task.taskid)'" if ($PSCmdlet.ShouldProcess($task.taskid, 'Remove-PSWorkItemArchive')) { Invoke-MySQLiteQuery @splat } } #foreach } else { Write-Warning $warn } } #process End { $PSDefaultParameterValues['_verbose:block'] = 'End' $PSDefaultParameterValues['_verbose:Command'] = $MyInvocation.MyCommand if ($conn.state -eq 'Open') { _verbose -message $strings.CloseDBConnection Close-MySQLiteDB -Connection $conn } _verbose -message $strings.Ending _verbose -message ($strings.RunTime -f (StopTimer)) } #end } |