functions/public/Get-PSWorkItemArchive.ps1
Function Get-PSWorkItemArchive { [cmdletbinding(DefaultParameterSetName = 'name')] [OutputType('PSWorkItemArchive')] Param( [Parameter( Position = 0, HelpMessage = 'The name of the work item. Wildcards are supported.', ValueFromPipelineByPropertyName, ParameterSetName = 'name' )] [ValidateNotNullOrEmpty()] [alias('task')] [String]$Name = '*', [Parameter( HelpMessage = 'The task ID.', ValueFromPipelineByPropertyName, ParameterSetName = 'id' )] [ValidateNotNullOrEmpty()] [String]$ID, [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.HelpMessage = 'Get all archived PSWorkItems by 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[]]$values = (Get-PSWorkItemData -Table Archive -Path $Path).Category | Foreach-Object { [CultureInfo]::CurrentCulture.TextInfo.ToTitleCase($_)} | Select-Object -unique | Sort-Object $v = New-Object System.Management.Automation.ValidateSetAttribute($values) $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)) } } #begin Process { $Category = $PSBoundParameters["Category"] $PSDefaultParameterValues["_verbose:block"] = "Process" #test if archive table has been updated to include the OriginalTaskID column $test = Invoke-MySQLiteQuery -Path $path -query "pragma table_info('archive')" | Where-Object name -eq 'id' if (-Not $test) { Write-Warning $strings.CannotVerifyIDColumn Return } Switch ($PSCmdlet.ParameterSetName) { 'category' { $query = "Select * from archive where category ='$Category' collate nocase" } 'id' { $query = "Select * from archive where ID ='$ID'" } 'name' { if ($Name -match '\*') { $Name = $name.replace('*', '%') $query = "Select * from archive where name like '$Name' collate nocase" } else { $query = "Select * from archive where name = '$Name' collate nocase" } } } _verbose -message $query $tasks = Invoke-MySQLiteQuery -Query $query -Path $Path if ($tasks.count -gt 0) { _verbose -message ($strings.FoundMatching -f $tasks.count) $results = foreach ($task in $tasks) { $task | Out-String | Write-Debug #March 10, 2023 PSWorkItemArchive is now a defined class _newWorkItemArchive $task -path $path #insert a new typename #$t.PSObject.TypeNames.insert(0, 'PSWorkItemArchive') #$t } $results | Sort-Object -Property TaskModified } else { Write-Warning $strings.FailedToFindArchivedTasks } } #process End { $PSDefaultParameterValues["_verbose:block"] = "End" $PSDefaultParameterValues["_verbose:Command"] = $MyInvocation.MyCommand _verbose -message $strings.Ending _verbose -message ($strings.RunTime -f (StopTimer)) } #end } |