<#
.SYNOPSIS
	Lists command-line tools
.DESCRIPTION
	This PowerShell script lists installed command-line interface (CLI) tools (sorted alphabetically by name).
.EXAMPLE
	PS> ./list-cli-tools.ps1

	Tool Name      Version   Installation Path
	---------      -------   -----------------
	7z             23.01     /usr/bin/7z (38 bytes)
	...
.LINK
	https://github.com/fleschutz/PowerShell
.NOTES
	Author: Markus Fleschutz | License: CC0
#>

function Bytes2String([int64]$bytes) {
        if ($bytes -lt 1000) { return "$bytes bytes" }
        $bytes /= 1000
        if ($bytes -lt 1000) { return "$($bytes)K" }
        $bytes /= 1000
        if ($bytes -lt 1000) { return "$($bytes)MB" }
        $bytes /= 1000
        if ($bytes -lt 1000) { return "$($bytes)GB" }
        $bytes /= 1000
        return "$($Bytes)TB"
}

function ListTool([string]$Name, [string]$VersionArg) {
	try {
		$Info = Get-Command $Name -ErrorAction Stop
		$Path = $Info.Source
		if ("$($Info.Version)" -eq "0.0.0.0") {
			if ("$VersionArg" -ne "") {
				$Result = Invoke-Expression "$Path $VersionArg"
				if ("$Result" -match '\d+.\d+\.\d+') {
					$Version = "$($Matches[0])"
				} elseif ("$Result" -match '\d+\.\d+') {
					$Version = "$($Matches[0])"
				} else {
					$Version = ""
				}
			} else {
				$Version = ""
			}
		} else {
			$Version = $Info.Version
		}
		if (Test-Path "$Path" -pathType leaf) {
			$Size = (Get-Item "$Path").Length
		} else {
			$Size = 0
		}
		New-Object PSObject -Property @{ 'Tool Name'=$Name; 'Version'=$Version; 'Installation Path'="$Path ($(Bytes2String $Size))" }
	} catch {
		return
	}
}

function ListTools {
	ListTool 7z		"-version"
	ListTool ant		"-v"
	ListTool apt		"--version"
	ListTool apt-get	"--version"
	ListTool amixer		"--version"
	ListTool aplay		"--version"
	ListTool apropos	"--version"
	ListTool ar		"--version"
	ListTool arch		"--version"
	ListTool arecord	"--version"
	ListTool arp		"--version"
	ListTool at		""
	ListTool attrib		""
	ListTool auditpol       ""
	ListTool awk		"--version"
	ListTool b2sum		"--version"
	ListTool base32		"--version"
	ListTool base64		"--version"
	ListTool basename	"--version"
	ListTool basenc		"--version"
	ListTool bash		"--version"
	ListTool bc		"--version"
	ListTool bcdboot        ""
	ListTool bcdedit	""
	ListTool bitsadmin      ""
	ListTool bunzip2	"--version"
	ListTool bzcat		"--version"
	ListTool bzip2		"--version"
	ListTool bzip2recover	"--version"
	ListTool captoinfo	"-V"
	ListTool cat		"-version"
	ListTool cc		"--version"
	ListTool certutil       "/?"
	ListTool chattr		"--version"
	ListTool chcon		"--version"
	ListTool chcpu		"--version"
	ListTool chdsk		""
	ListTool chglogon       ""
	ListTool chgport        ""
	ListTool chgusr         ""
	ListTool chgrp		"--version"
	ListTool chmod		"--version"
	ListTool chkntfs	""
	ListTool chmem		"--version"
	ListTool choice         "/?"
	ListTool chown		"--version"
	ListTool chpasswd	"--version"
	ListTool chroot		"--version"
	ListTool choco		"--version"
	ListTool cipher		""
	ListTool cksum		"--version"
	ListTool clang		"--version"
	ListTool clear		"-V"
	ListTool cmake		"--version"
	ListTool cmd		""
	ListTool cmdkey         "/list"
	ListTool cmp		"--version"
	ListTool column		"--version"
	ListTool comp		""
	ListTool compact	""
	ListTool cp		"--version"
	ListTool cpack		"--version"
	ListTool cscript        ""
	ListTool csplit		"--version"
	ListTool ctest		"--version"
	ListTool curl		"--version"
	ListTool curl.exe       "--version"
	ListTool cut		"--version"
	ListTool cygcheck	"--version"
	ListTool cygpath	"--version"
	ListTool d2u		"--version"
	ListTool dash		"--version"
	ListTool date		""
	ListTool dd		"--version"
	ListTool delgroup	"--version"
	ListTool deluser	"--version"
	ListTool df		"--version"
	ListTool diff		"--version"
	ListTool diff3		"--version"
	ListTool dir		"--version"
	ListTool dircolors	"--version"
	ListTool dirname	"--version"
	ListTool dism		""
	ListTool dmidecode	"--version"
	ListTool dos2unix	"--version"
	ListTool doskey         "/?"
	ListTool dotnet         "--info"
	ListTool driverquery	""
	ListTool du		"--version"
	ListTool echo		"--version"
	ListTool egrep		"--version"
	ListTool emacs		"--version"
	ListTool env		"--version"
	ListTool eventcreate    "/?"
	ListTool ex		"--version"
	ListTool expand		"--version"
	ListTool expr		"--version"
	ListTool factor		"--version"
	ListTool false		"--version"
	ListTool fido2-assert	"--version"
	ListTool fido2-cred	"--version"
	ListTool fido2-token	"--version"
	ListTool file		"--version"
	ListTool find		"--version"
	ListTool fish		"--version"
	ListTool fgrep		"--version"
	ListTool fmt		"--version"
	ListTool fold		"--version"
	ListTool ftp		"-?"
	ListTool funzip		"--version"
	ListTool gawk		"--version"
	ListTool gencat		"--version"
	ListTool getconf	"--version"
	ListTool getopt		"--version"
	ListTool gettext	"--version"
	ListTool gcc		"--version"
	ListTool gdb		"--version"
	ListTool gh		"--version"
	ListTool git		"--version"
	ListTool gkill		"--version"
	ListTool gmondump	"--version"
	ListTool gpg		"--version"
	ListTool gpg-agent	"--version"
	ListTool gpgconf	"--version"
	ListTool gpg-error	"--version"
	ListTool gpgsplit	"--version"
	ListTool gpgtar		"--version"
	ListTool gradle		"--version"
	ListTool grep		"--version"
	ListTool groups		"--version"
	ListTool gzip		"--version"
	ListTool head		"--version"
	ListTool hcsdiag	""
	ListTool help		"--version"
	ListTool hmac256	"--version"
	ListTool hostid		"--version"
	ListTool hostname	""
	ListTool htop		"--version"
	ListTool icacls		"--version"
	ListTool iconv		"--version"
	ListTool id		"--version"
	ListTool ip		"help"
	ListTool ipfs		"--version"
	ListTool java		"--version"
	ListTool jcli		"version"
	ListTool join		"--version"
	ListTool jhead		"-V"
	ListTool kill		"--version"
	ListTool ldd		"--version"
	ListTool less		"--version"
	ListTool link		"--version"
	ListTool ln		"--version"
	ListTool locale		"--version"
	ListTool locate		"--version"
	ListTool logname	"--version"
	ListTool ls		"--version"
	ListTool lsattr		"-V"
	ListTool lsb_release	""
	ListTool lzma		"--version"
	ListTool mac2unix	"--version"
	ListTool make		"--version"
	ListTool mbr2gpt	""
	ListTool md5sum		"--version"
	ListTool minidumper	"--version"
	ListTool mkdir		"--version"
	ListTool mkfifo		"--version"
	ListTool mkgroup	"--version"
	ListTool mknod		"--version"
	ListTool mkpasswd	"--version"
	ListTool mktemp		"--version"
	ListTool mount		"--version"
	ListTool MpCmdRun	"-h"
	ListTool nano		"--version"
	ListTool netsh		""
	ListTool netstat	""
	ListTool nice		"--version"
	ListTool nmap		"--version"
	ListTool nohup		"--version"
	ListTool nroff		"--version"
	ListTool nslookup	""
	ListTool openssl	""
	ListTool pandoc		"--version"
	ListTool passwd		"--status"
	ListTool paste		"--version"
	ListTool perl		"--version"
	ListTool ping		"-V"
	ListTool ping6		"-V"
	ListTool pip		"--version"
	ListTool pip3		"--version"
	ListTool pip3.8		"--version"
	ListTool pnputil	"/?"
	ListTool powercfg	"/?"
	ListTool powershell	"--version"
	ListTool print		""
	ListTool printf		"--version"
	ListTool pro		"--version"
	ListTool python		"--version"
	ListTool python3	"--version"
	ListTool python3.8	"--version"
	ListTool rasdial	"--version"
	ListTool regedit	"--version"
	ListTool replace	"--version"
	ListTool robocopy	"--version"
	ListTool route		""
	ListTool rpcping        ""
	ListTool rsh		""
	ListTool rsync		"--version"
	ListTool rundll32	"--version"
	ListTool sc.exe		"/?"
	ListTool scp		""
	ListTool setx           ""
	ListTool sftp		""
	ListTool sh		"--version"
	ListTool sha1sum	"--version"
	ListTool sha256sum	"--version"
	ListTool sha512sum	"--version"
	ListTool ssh		"-V"
	ListTool ssh-keygen	""
	ListTool smartctl	"--version"
	ListTool sort		"--version"
	ListTool split		"--version"
	ListTool strace		"--version"
	ListTool strings	"--version"
	ListTool strip		"--version"
	ListTool sudo		"--version"
	ListTool systeminfo	""
	ListTool tail		"--version"
	ListTool tar		"--version"
	ListTool taskkill	""
	ListTool tasklist	""
	ListTool tcpdump	"--version"
	ListTool tee		"--version"
	ListTool terraform	"--version"
	ListTool time		""
	ListTool timeout	""
	ListTool top		"--version"
	ListTool tskill		""
	ListTool typeperf	""
	ListTool tzsync		"--version"
	ListTool unbound	"-V"
	ListTool uniq		"--version"
	ListTool vi		"--version"
	ListTool vim		"--version"
	ListTool vssadmin       "/?"
	ListTool vulkaninfo	"--version"
	ListTool w32tm		"/?"
	ListTool waitfor	"--version"
	ListTool wakeonlan	"-v"
	ListTool wget		"--version"
	ListTool where		"--version"
	ListTool whatis		"--version"
	ListTool which		""
	ListTool winget		"--version"
	ListTool winsat		""
	ListTool whoami		"--version"
	ListTool wput		"--version"
	ListTool write		""
	ListTool wsl		"--version"
	ListTool xcopy		"--version"
	ListTool yes		"--version"
	ListTool zip		"--version"
	ListTool zipcloak	"--version"
	ListTool zipdetails	""
	ListTool zipgrep	""
	ListTool zipinfo	""
	ListTool zipnote	""
	ListTool zipsplit	""
	ListTool zsh		"--version"
}
 
try {
	ListTools | Format-Table -property @{e='Tool Name';width=15},@{e='Version';width=15},@{e='Installation Path';width=90}
	exit 0 # success
} catch {
	"⚠️ Error in line $($_.InvocationInfo.ScriptLineNumber): $($Error[0])"
	exit 1
}
