Private/New-Shortcut.ps1

#requires -version 4
function New-Shortcut
{
    [CmdletBinding()]
    param (
        [Parameter(Mandatory = $true,
            Position = 0,
            ValueFromPipeline = $true,
            ValueFromPipelineByPropertyName = $true,
            HelpMessage = "Path to one or more locations.")]
        [ValidateNotNullOrEmpty()]
        [string]$Target,
        
        [Parameter(Mandatory = $true,
            Position = 1,
            ValueFromPipeline = $true,
            ValueFromPipelineByPropertyName = $true,
            HelpMessage = "Path to one or more locations.")]
        [ValidateNotNullOrEmpty()]
        [string]$Destination,
        
        [Parameter(Mandatory = $false,
            Position = 2,
            ValueFromPipeline = $true,
            ValueFromPipelineByPropertyName = $true,
            HelpMessage = "Path to one or more locations.")]
        [ValidateNotNullOrEmpty()]
        [string]$Arguments = $null
    )
    
    if (!(Test-Path $Destination -IsValid))
    {
        Throw "Shortcut destination path is not valid. Got $($Destination)"
    }

    if (Test-Path $Destination)
    {
        Remove-Item $Destination -ErrorAction:SilentlyContinue | Out-Null
    }

    Write-Verbose "Creating shortcut: $($Destination)"
    $WshShell = New-Object -comObject WScript.Shell
    $Shortcut = $WshShell.CreateShortcut($Destination)
    $Shortcut.TargetPath = $Target

    if (($Arguments -ne $null) -and ($Destination -match '.+\.lnk$'))
    {
        $Shortcut.Arguments = $Arguments
    }

    $Shortcut.Save()
}