# This script ONLY GENERATES .reg files. It does NOT modify the registry.
# Elevation is required because reg.exe export requires it.
$OutputDir = "$PSScriptRoot\FileAssociations"
New-Item -ItemType Directory -Path $OutputDir -Force | Out-Null
# =========================
# File extensions
# =========================
$Extensions = @(
"AVI","BAT","BMP","CHM","CMD","COM","EXE","GIF","HTM","HTML",
"ICO","IMG","INF","JPE","JPEG","JPG","JS","LNK","MP3","MPE",
"MPEG","MPG","MSC","PS1","PS1XML","PSC1","PSD1","PSM1",
"REG","SCR","TIF","TIFF","TXT","VBS","WMA","WMV","XML","ZIP"
)
foreach ($Ext in $Extensions) {
$DotExt = ".$Ext"
$OutReg = Join-Path $OutputDir "$Ext.reg"
$TmpExt = "$env:TEMP\${Ext}_ext.reg"
$TmpProg = "$env:TEMP\${Ext}_prog.reg"
# Always export HKCR\.EXT
reg export "HKCR\$DotExt" $TmpExt /y | Out-Null
# Try to read default ProgID (may legitimately be missing)
$ProgId = (Get-ItemProperty `
-Path "Registry::HKEY_CLASSES_ROOT\$DotExt" `
-ErrorAction SilentlyContinue)."(default)"
$Header = "Windows Registry Editor Version 5.00`r`n`r`n"
$ExtBlock = (Get-Content $TmpExt | Select-Object -Skip 1) -join "`r`n"
$Content = $Header + $ExtBlock
if ($ProgId) {
# Export HKCR\<ProgID>
reg export "HKCR\$ProgId" $TmpProg /y | Out-Null
$ProgBlock = (Get-Content $TmpProg | Select-Object -Skip 1) -join "`r`n"
$ResetBlock = @(
"",
"",
$ProgBlock,
"",
"[-HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\$DotExt\UserChoice]",
"",
"[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\$DotExt\OpenWithProgids]",
"`"$ProgId`"=hex(0):"
) -join "`r`n"
$Content += $ResetBlock
}
$Content | Set-Content -Encoding Unicode $OutReg
Remove-Item $TmpExt -Force
if (Test-Path $TmpProg) { Remove-Item $TmpProg -Force }
}
# =========================
# Shell objects (NOT extensions)
# =========================
$ShellObjects = @("Directory","Folder","Drive")
foreach ($Obj in $ShellObjects) {
$OutReg = Join-Path $OutputDir "$Obj.reg"
$TmpObj = "$env:TEMP\${Obj}_obj.reg"
reg export "HKCR\$Obj" $TmpObj /y | Out-Null
$Header = "Windows Registry Editor Version 5.00`r`n`r`n"
$ObjBlock = (Get-Content $TmpObj | Select-Object -Skip 1) -join "`r`n"
($Header + $ObjBlock) |
Set-Content -Encoding Unicode $OutReg
Remove-Item $TmpObj -Force
}