@echo off
REM °²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²°
REM °² Enumerates all files extensions                     ²°
REM °² and what opens them on Windows 10/11 in batch/cmd   ²°
REM °² twitter: @ollieatnowhere                            ²°
REM °²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²°


REM ------------------------------------------------------
REM
REM this batch file employs various approaches to 
REM enumerate what opens what.
REM
REM ------------------------------------------------------


REM features++
SETLOCAL ENABLEDELAYEDEXPANSION 

REM ---------------------
REM New Windows Approach
REM ---------------------

REM read the list of file extensions
for /f "tokens=1,2 delims==" %%G in ('reg query "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts"') do (

	REM extract the last bit of the string i.e. the extension	
	for %%a in ("%%G\.") do (

		set "lastPart=%%~nxa"

		REM find out the users default choice for this extension
		for /f "tokens=2*" %%I in ('reg query "%%G\UserChoice" 2^>nul ^| findstr ProgId') do (

			REM set it to what we think it could be 
			set "exeProg=%%J"	

			REM try the lookup and see what it is (if this fails the above works as a fall back)
			REM this is for entries from the above which begin with something like ChromeHTML
			for /f "tokens=2*" %%A in ('reg query HKEY_LOCAL_MACHINE\SOFTWARE\Classes\%%J\shell\open\command 2^>nul') do (

				REM take the bit before the comma
				for /f "tokens=1 delims=," %%K in ("%%B") do (
					set "exeProg=%%K"
				)
				
			)

			REM try another lookup
			REM this is for entries from above which begin with AppX
			for /f "tokens=2*" %%A in ('reg query HKEY_CLASSES_ROOT\%%J\Application 2^>nul ^| findstr AppUserModelID') do (

				set "exeProg=%%B"
				
			)
			
			REM print it out	
			echo %COMPUTERNAME%,!lastPart!,!exeProg!	
	
		)
	)
)


REM ---------------------
REM Legacy Windows Approach
REM ---------------------

REM run assoc and extract the extension and name
for /f "tokens=1,2 delims==" %%G in ('assoc') do (
	REM find the executable
	for /f "tokens=1,2 delims==" %%I in ('ftype %%H 2^> nul') do (
		REM extract everything before the comma
		for /f "tokens=1 delims=," %%K in ("%%B") do (
			REM print it outd
			echo %COMPUTERNAME%,%%G,%%J
		)
	)
)