Public/Export-PSNote.ps1

Function Export-PSNote{
    <#
    .SYNOPSIS
        Use to export your PSNotes to copy to another machine or share with others

    .DESCRIPTION
        Allows you to export your PSNotes to a JSON file, that can then be imported
        to another machine or by other users.

    .PARAMETER NoteObject
        The PSNote objects you want to export. Use Get-PSNote to build the object and pass it to the parameter
        or use a pipeline to pass it.

    .PARAMETER All
        Export all PSNotes

    .PARAMETER Path
        The path to the PSNotes JSON file to export to.

    .PARAMETER Append
        Use to append the output file. Default is to overwrite.

    .EXAMPLE
        Export-PSNote -All -Path C:\Export\MyPSNotes.json

        Exportall notes to a JSON file.

    .EXAMPLE
        Get-PSNote -tag 'AD' | Export-PSNote -Path C:\Export\SharedADNotes.json

        Exports all notes with the tag 'AD' to the file SharedADNotes.json
    
    
    
    .LINK
        https://github.com/mdowst/PSNotes
    #>

    [cmdletbinding(DefaultParameterSetName="Note")]
    param(    
        [parameter(Mandatory=$true, ValueFromPipeline=$true, ParameterSetName="Note")]
        [PSNote[]]$NoteObject,
        [parameter(Mandatory=$false, ParameterSetName="All")]
        [switch]$All,
        [parameter(Mandatory=$true)]
        [string]$Path,
        [parameter(Mandatory=$false)]
        [switch]$Append
    )
    begin{
        [System.Collections.Generic.List[PSNoteExport]] $ExportObjects = @()
        Write-Verbose "$($noteObject | FT | Out-String)"
    }
    process{
        # If All add all objects otherwise only add those passed
        if($All){
            $noteObjects | ForEach-Object{ $ExportObjects.Add( [PSNoteExport]::New( $_ ) ) }
        } else {
            $noteObject | ForEach-Object{ $ExportObjects.Add( [PSNoteExport]::New( $_ ) ) }
        }
    }
    end{
        Write-Verbose "$($ExportObjects | FT | Out-String)"
        # if append add append objects before exporting
        if($Append){
            if(-not (Test-Path $path)){
                Write-Verbose "File '$path' not found. Will continue with export, but will not append."
            } else {
                # import existing from JSON, but overwrite any matching Notes with the new value
                $(Get-Content $Path -Raw | ConvertFrom-Json) | Select-Object Note, Snippet, Details, Alias, Tags | 
                    Where-Object{ $ExportObjects.Alias -notcontains $_.Alias } | ForEach-Object{ 
                        $ExportObjects.Add([PSNoteExport]::New( $_ )) 
                }
            }
            
        }

        $ExportObjects | ConvertTo-Json | Out-File $Path -Encoding UTF8NoBOM
    }
}