<#
.SYNOPSIS
	Lists available command-line interface (CLI) tools
.DESCRIPTION
	This script lists available command-line interface (CLI) tools.
.EXAMPLE
	PS> ./list-cli-tools

	Name         Version         Location                                        FileSize
	----         -------         --------                                        --------
	at           10.0.19041.1    C:\WINDOWS\system32\at.exe                         31232
	attrib       10.0.19041.1    C:\WINDOWS\system32\attrib.exe                     23040
	...
.NOTES
	Author: Markus Fleschutz · License: CC0
.LINK
	https://github.com/fleschutz/PowerShell
#>

function CheckFor { param([string]$Cmd, [string]$VersionArg)
	try {
		$Info = Get-Command $Cmd -ErrorAction Stop
		$Location = $Info.Source
		if ("$($Info.Version)" -eq "0.0.0.0") {
			if ("$VersionArg" -ne "") {
				$Result = invoke-expression "$Location $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 "$Location" -pathType leaf) {
			$FileSize = (Get-Item "$Location").Length
		} else {
			$FileSize = "0"
		}
		new-object PSObject -Property @{ Name=$Cmd; Version=$Version; Location=$Location; FileSize=$FileSize }
	} catch {
		return
	}
}

function ListTools { 
	CheckFor 7z	"-version"
	CheckFor ant	"-v"
	CheckFor apt	"--version"
	CheckFor apt-get "--version"
	CheckFor amixer	"--version"
	CheckFor aplay	"--version"
	CheckFor ar	"--version"
	CheckFor arecord "--version"
	CheckFor at	""
	CheckFor attrib	""
	CheckFor awk	"--version"
	CheckFor basename "--version"
	CheckFor bash	"--version"
	CheckFor bc	"--version"
	CheckFor cc	"--version"
	CheckFor chdsk	""
	CheckFor chkntfs ""
	CheckFor cipher ""
	CheckFor cksum	"--version"
	CheckFor clang	"--version"
	CheckFor cmake	"--version"
	CheckFor cmd	""
	CheckFor comp	""
	CheckFor compact ""
	CheckFor cpack	"--version"
	CheckFor ctest	"--version"
	CheckFor curl	"--version"
	CheckFor cut	"--version"
	CheckFor date	""
	CheckFor diff	"--version"
	CheckFor dism	""
	CheckFor driverquery ""
	CheckFor find	"--version"
	CheckFor ftp	"--version"
	CheckFor gcc	"--version"
	CheckFor gdb	"--version"
	CheckFor gh	"--version"
	CheckFor git	"--version"
	CheckFor gpg	"--version"
	CheckFor hcsdiag ""
	CheckFor help	"--version"
	CheckFor hostname ""
	CheckFor htop	"--version"
	CheckFor ipfs	"--version"
	CheckFor java	"--version"
	CheckFor lsb_release ""
	CheckFor lzma	"--version"
	CheckFor make	"--version"
	CheckFor md5sum "--version"
	CheckFor mkfifo "--version"
	CheckFor mount	"--version"
	CheckFor nice	"--version"
	CheckFor nroff	"--version"
	CheckFor nslookup ""
	CheckFor openssl ""
	CheckFor perl	"--version"
	CheckFor ping	"-V"
	CheckFor ping6	"-V"
	CheckFor powershell "--version"
	CheckFor print	""
	CheckFor printf "--version"
	CheckFor python "--version"
	CheckFor python3 "--version"
	CheckFor regedit "--version"
	CheckFor replace "--version"
	CheckFor robocopy "--version"
	CheckFor rsh	""
	CheckFor rsync	"--version"
	CheckFor rundll32 "--version"
	CheckFor scp	""
	CheckFor sftp	""
	CheckFor sha1sum "--version"
	CheckFor sha256sum "--version"
	CheckFor sha512sum "--version"
	CheckFor ssh	""
	CheckFor ssh-keygen ""
	CheckFor sort	"--version"
	CheckFor split	"--version"
	CheckFor strace	"--version"
	CheckFor strings "--version"
	CheckFor strip	"--version"
	CheckFor sudo	"--version"
	CheckFor systeminfo ""
	CheckFor tail	"--version"
	CheckFor tar	"--version"
	CheckFor taskkill ""
	CheckFor tasklist ""
	CheckFor tee	"--version"
	CheckFor time	""
	CheckFor timeout ""
	CheckFor top	"-v"
	CheckFor tskill ""
	CheckFor typeperf ""
	CheckFor tzsync "--version"
	CheckFor uniq	"--version"
	CheckFor vi	"--version"
	CheckFor vim	"--version"
	CheckFor vulkaninfo "--version"
	CheckFor waitfor "--version"
	CheckFor wakeonlan ""
	CheckFor wget	"--version"
	CheckFor where	"--version"
	CheckFor whatis "--version"
	CheckFor which	""
	CheckFor winget	"--version"
	CheckFor whoami "--version"
	CheckFor wput	"--version"
	CheckFor write	""
	CheckFor wsl	"--version"
	CheckFor xcopy	"--version"
	CheckFor yes	"--version"
	CheckFor zip	"--version"
	CheckFor zipcloak "--version"
	CheckFor zipdetails ""
	CheckFor zipgrep ""
	CheckFor zipinfo ""
	CheckFor zipnote ""
	CheckFor zipsplit ""
	CheckFor zsh	"--version"
}
 
try {
	ListTools | format-table -property @{e='Name';width=12},@{e='Version';width=15},@{e='Location';width=55},@{e='FileSize';width=10}
	exit 0 # success
} catch {
	"⚠️ Error: $($Error[0]) ($($MyInvocation.MyCommand.Name):$($_.InvocationInfo.ScriptLineNumber))"
	exit 1
}