Public/New-Symlink.ps1

<#
.SYNOPSIS
Creates a symbolic link.
 
.DESCRIPTION
Wraps New-Item -ItemType SymbolicLink to create a symlink at -Path that points
to -Value. Extra arguments are passed through to New-Item.
 
.PARAMETER Value
Target path that the symbolic link points to.
 
.PARAMETER Path
Symbolic link path to create.
 
.PARAMETER Arguments
Additional arguments forwarded to New-Item.
 
.EXAMPLE
New-Symlink -Value "C:\Tools" -Path "D:\ToolLink"
 
Creates D:\ToolLink as a symbolic link to C:\Tools.
#>

function New-Symlink {
    [CmdletBinding()]
    [OutputType([System.IO.FileSystemInfo])]
    param (
        [Parameter(ParameterSetName = 'nameSet', Position = 0, ValueFromPipelineByPropertyName = $true)]
        [Parameter(ParameterSetName = 'pathSet', Mandatory = $true, Position = 0, ValueFromPipelineByPropertyName = $true)]
        [string[]]
        ${Path},

        [Parameter(ParameterSetName = 'nameSet', Mandatory = $true, ValueFromPipelineByPropertyName = $true)]
        [AllowNull()]
        [AllowEmptyString()]
        [string]
        ${Name},

        [Parameter(Position = 1, ValueFromPipeline = $true, ValueFromPipelineByPropertyName = $true)]
        [Alias('Target')]
        [System.Object]
        ${Value},

        [switch]
        ${Force},

        [Parameter(ValueFromPipelineByPropertyName = $true)]
        [pscredential]
        [System.Management.Automation.CredentialAttribute()]
        ${Credential})


    dynamicparam {
        try {
            $targetCmd = $ExecutionContext.InvokeCommand.GetCommand('Microsoft.PowerShell.Management\New-Item', [System.Management.Automation.CommandTypes]::Cmdlet, $PSBoundParameters)
            $dynamicParams = @($targetCmd.Parameters.GetEnumerator() | Microsoft.PowerShell.Core\Where-Object { $_.Value.IsDynamic })
            if ($dynamicParams.Length -gt 0) {
                $paramDictionary = [Management.Automation.RuntimeDefinedParameterDictionary]::new()
                foreach ($param in $dynamicParams) {
                    $param = $param.Value

                    if (-not $MyInvocation.MyCommand.Parameters.ContainsKey($param.Name)) {
                        $dynParam = [Management.Automation.RuntimeDefinedParameter]::new($param.Name, $param.ParameterType, $param.Attributes)
                        $paramDictionary.Add($param.Name, $dynParam)
                    }
                }
                return $paramDictionary
            }
        }
        catch {
            throw
        }
    }
    process {
        Microsoft.PowerShell.Management\New-Item -ItemType SymbolicLink @PsBoundParameters
    }
}