src/open_command.ps1

#!/usr/bin/env pwsh
$ErrorActionPreference = "Stop"
Set-StrictMode -Version Latest


<#
.SYNOPSIS
    Opens the given target in the default application for its file type.
.PARAMETER Target
    The target to open.
.PARAMETER Rest
    Any additional arguments to pass to the open command.
#>

function open_command {
    param(
        [Parameter(Mandatory=$true, Position=0)]
        [ValidateNotNullOrEmpty()]
        [string] $target,

        [Parameter(Mandatory=$false, Position=1, ValueFromRemainingArguments=$true)]
        [string[]] $rest = @()
    )

    [string[]] $open_cmd = $null

    if ($Env:BROWSER) {
        [Uri] $targetAsUri = $null
        [Uri]::TryCreate($target, [ref] $targetAsUri)
        if ($targetAsUri -and $targetAsUri.Scheme -notin @("http", "https")) {
            $targetAsUri = $null
        }
    }

    # define the open command
    if ($targetAsUri) {
        $open_cmd = @($Env:BROWSER)
    } elseif ($IsWSL) {
        $open_cmd=@('cmd.exe', '/c', 'start', '""')
        if (Test-Path $target) {
            $target = (wslpath -w $target)
        }
    } elseif ($IsWindows) {
        $open_cmd=@('cmd.exe', '/c', 'start', '""')
    } elseif ($IsLinux) {
        if (Test-Command xdg-open) {
            $open_cmd=@('nohup', 'xdg-open')
        } elseif (Test-Command gvfs-open) {
            $open_cmd=@('nohup', 'gvfs-open')
        } elseif (Test-Command exo-open) {
            $open_cmd=@('nohup', 'exo-open')
        } elseif (Test-Command kde-open) {
            $open_cmd=@('nohup', 'kde-open')
        } else {
            throw [System.PlatformNotSupportedException]::new("No supported open command found. Please install one of xdg-open, gvfs-open, exo-open, or kde-open.")
        }
    } elseif ($IsMacOS) {
        $open_cmd=@('open')
    } else {
        throw [System.PlatformNotSupportedException]::new()
    }

    # add the target
    $open_cmd += @($target)

    # add the rest of the arguments
    if ($rest) {
        $open_cmd += @($rest)
    }

    # run the command
    &$x[0] $x[1..($x.Length-1)]
}