Functions.ps1


<#
 .Synopsis
   Add folder to bookmarks list.
 
 .Description
  Add folder to bookmarks list.
 
 .Parameter Name
  The bookmark name.
 
 .Parameter Path
  The Path to folder.
 
 .Example
   # Add bookmark with name.
   ./Add-PSBookmark [ ba ] BookmarkName (Opt)Directory
 
 .Example
   # Add bookmark from pipeline.
   $pwd | Add-PSBookmark -Name "ThisDirectory"
#>

function Add-PSBookmark () {
    Param (
        [Parameter(Position = 0, Mandatory = $true)]
        [Alias("Bookmark")]
        $Name,
        [Parameter(Position = 1, ValueFromPipeline  = $True)]
        [Alias("Path")]
        [string]$dir = $null
    )
    if ( [string]::IsNullOrEmpty($dir) ) {
        $dir = (Get-Location).Path
    }

    Restore-PSBookmarks
    $_marks["$Name"] = $dir
    Save-PSBookmarks
    Write-Output ("Location '{1}' saved to bookmark '{0}'" -f $Name, $dir)     
}


<#
 .Synopsis
  Delete bookmark from list.
 
 .Description
  Removes folder from bookmarks list.
 
 .Parameter Name
  The bookmark name.
 .Example
   # Add bookmark with name.
   ./Remove-PSBookmark [ br ] BookmarkName
#>

function Remove-PSBookmark () {
    Param (
        [Parameter(Position = 0, Mandatory = $true)]
        [Alias("Bookmark")]
        [ArgumentCompleter(
            {
                param($Command, $Parameter, $WordToComplete, $CommandAst, $FakeBoundParams)
                return @($_marks) -like "$WordToComplete*"
            }
        )]
        $Name
    )

    Restore-PSBookmarks
    $_marks.Remove($Name)
    Save-PSBookmarks
    Write-Output ("Location '{0}' removed from bookmarks" -f $Name)     
}

function Remove-AllPSBookmarks {
    $_marks.Clone() | ForEach-Object{$_.keys} | ForEach-Object{$_marks.remove($_)}
    Save-PSBookmarks
}

<#
 .Synopsis
  Open saved bookmark.
 
 .Description
  Open saved bookmark.
 
 .Parameter Name
  The bookmark name.
 .Example
   # Add bookmark with name.
   ./Open-PSBookmark [ bo ] BookmarkName
#>

function Open-PSBookmark() {
    Param(
    [Parameter(Position = 0, ValueFromPipelineByPropertyName  = $True, Mandatory = $true)]
    [Alias("Bookmark")]
    [ArgumentCompleter(
        {
            param($Command, $Parameter, $WordToComplete, $CommandAst, $FakeBoundParams)
            return @($_marks) -like "$WordToComplete*"
        }
    )]
    $Name
    )
    Set-Location $_marks["$Name"]
}

function Restore-PSBookmarks {
    if (test-path $_marksPath) {
        Import-Csv $_marksPath | ForEach-Object { $_marks[$_.key] = $_.value }
    }
}
function Save-PSBookmarks {
    $_marks.getenumerator() | export-csv $_marksPath -notype
}


<#
 .Synopsis
  List saved bookmark.
 
 .Description
  List saved bookmark.
 
 .Example
   # Add bookmark with name.
   ./Get-PSBookmarks [ bl ] [bv]
#>

function Get-PSBookmarks {
    Restore-PSBookmarks
    $_marks.Clone()
}

$_marks = @{ }
$_marksPath = Join-Path (split-path -parent $profile) .bookmarks


Restore-PSBookmarks


##Load Extra functions
$curDir = Split-Path $MyInvocation.MyCommand.Path

if(Test-Path ($shared = Join-Path -Path $curDir -ChildPath ".\Shared.ps1" )) {
    . $shared
}
else{
    Write-Output "Loading shared modules:"

    Join-Path -Path $curDir -ChildPath "..\Shared-Functions\*.ps1"  -Resolve | `
    ForEach-Object{ 
        Write-Output $PSItem; . $PSItem
    }
}


if ( $MyInvocation.MyCommand.Name.EndsWith('.psm1') ){
    #Write-Output "Module"
    Export-ModuleMember -Function Add-PSBookmark 
    Export-ModuleMember -Function Remove-PSBookmarks
    Export-ModuleMember -Function Open-PSBookmark
    Export-ModuleMember -Function Get-PSBookmarks
    Export-ModuleMember -Function Remove-AllPSBookmarks
}
else{
    #file
    #Invoke-ScriptFunction $DestFolder $SrcFolder
}