Public/Find-Know.ps1

<#
 
# Find-Know
 
Wissen in dieser PowerShell-Datenbank finden
 
- **Hashtags** Wissen PowerShell
 
- **Version** 2020.05.22
 
#>



using namespace 'System'
using namespace 'System.IO'
using namespace 'System.Text.RegularExpressions'
using namespace 'System.Management.Automation'

[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSReviewUnusedParameter', '')]
param()

$BackupErrorActionPreference = $ErrorActionPreference
$ErrorActionPreference = [ActionPreference]::Stop
Set-StrictMode -Version Latest

function Find-Know {
    <#
        .SYNOPSIS
            PowerShell-Wissen im AKPT-Module finden
         
        .PARAMETER Keyword
            Ein oder mehrere Keywords die im Titel, der Beschreibung, der Tags und im Inhalt (s. -IncludeContent) gesucht wird.
 
        .PARAMETER IncludeContent
            Bei der Suche wird der Inhalt einbezogen.
 
        .EXAMPLE
            Find-Know
 
        .EXAMPLE
            Find-Know -Keyword 'Analyzer' -Detailed
 
        .EXAMPLE
            Find-Know -Keyword 'Analyzer' -IncludeContent
 
        .EXAMPLE
            Find-Know -AsMarkdownContent | ConvertFrom-Markdown -AsVT100EncodedString | Show-Markdown
 
        .EXAMPLE
            Find-Know -AsMarkdownContent | ConvertFrom-Markdown | Show-Markdown -UseBrowser
 
        .EXAMPLE
            Find-Know -Keyword 'Analyzer' -Verbose
 
        .EXAMPLE
            Get-Help -Name 'Find-Know' -ShowWindow
    #>

    [Alias("fk")]
    [CmdletBinding(DefaultParameterSetName='Default')]
    param (
        [Parameter(ParameterSetName='Default', Position=1)]
        [Parameter(ParameterSetName='Markdown', Position=1)]
        [string[]]$Keyword,

        [Parameter(ParameterSetName='Default')]
        [switch]$Detailed,

        [Parameter(ParameterSetName='Default')]
        [Parameter(ParameterSetName='Markdown')]
        [switch]$IncludeContent,
        
        [Parameter(ParameterSetName='Markdown')]
        [switch]$AsMarkdownContent
    )
    begin{
        $SumMarkdownContent = "# Übersicht AKPT$([Environment]::NewLine)$([Environment]::NewLine)"
        Get-ChildItem -Path $AkptModulePath -File -Recurse -PipelineVariable 'file' | Where-Object -Property 'Extension' -INE -Value ([String]::Empty) | Where-Object -FilterScript {
                $file.FullName -INotLike "$AkptModulePath\.Private\*" -and $file.FullName -INotLike "$AkptModulePath\.vscode\*" -and $file.Extension -INotIn '.ps1xml', '.pfx', '.zip', '.png' -and $file.FullName -INotLike '*.help.txt'
        } | ForEach-Object -Process {
            $Script:AnalyseStart = Get-Date
            $fileContent = [File]::ReadAllText($file.FullName)
            $isMatch = $fileContent -iMatch '^(?:<#\r\n\r\n)?(?<MarkdownContent>#\s(?<Title>.+)\r\n\r\n(?<Description>(?:.+)(?:\r\n\r\n.+)*)\r\n\r\n-\s\*\*Hashtags\*\*\s(?<Hashtags>.+)(?:\r\n)?\r\n-\s\*\*Version\*\*\s(?<Version>[0-9\.]{8,13})\r\n\r\n)(?:#>)?'
            if(!$isMatch) {
                "Die Datei enthält nicht den benötigten Markdown-Prolog (# 1. Überschrift, Beschreibung, - **Hashtags** und - **Version**, Datei: $($file.FullName)." | Write-Warning
                return
            }
            return [PSCustomObject]@{
                Title           = $Matches['Title']
                FileName        = $file.Name
                Description     = $Matches['Description']
                Hashtags        = $Matches['Hashtags'] -split ' '
                Version         = $Matches['Version']
                FileFullName    = $file.FullName
                MarkdownContent = $Matches['MarkdownContent']
            }
        } | Where-Object -FilterScript {
            $pattern = "($($Keyword -join "|"))"
            $_.MarkdownContent -IMatch $pattern -or ($IncludeContent -and ($file | Select-String -Pattern $pattern -Quiet))
            $AnalyseDauer = (Get-Date) - $Script:AnalyseStart
            "In $($AnalyseDauer.TotalMilliseconds.ToString('0')) Sek. Datei-Inhalt von $($file.Name) analysiert." | Write-Verbose
        } | ForEach-Object -Process {
            if ($AsMarkdownContent) {
                $SumMarkdownContent += $_.MarkdownContent -replace '# ', '## '
            }else {
                $result = $_
                if (!$Detailed) {
                    $result = $_ | Select-Object -Property 'Title', 'FileName', 'Description'
                }
                return $result
            }
        }
        
        if ($AsMarkdownContent) {
            return $SumMarkdownContent
        }
    }   
}

New-Alias -Name fk -Value 'Find-Know' -Force
$ErrorActionPreference = $BackupErrorActionPreference