Revit Icons
I've seen this idea used before, but BIMPURE has released an icon set to help differentiate between the different Revit years (and even supplies it for multiple languages and gives out the .psd file if you want to customize it to your needs or preferences). They make excellent tutorials and content.
<#
Title: Set Revit Start Menu & Taskbar Icons - Dynamic Version Detection
.SYNOPSIS
Downloads available Revit version icons and applies them to matching Start Menu shortcuts.
.DESCRIPTION
This script dynamically probes a remote icon repository for available Revit icon files
following the rYYYY.ico naming convention. For each year in a rolling window, the script:
- Checks if an icon exists on the server
- Downloads the icon if available
- Attempts to match the icon to an installed Revit Start Menu folder
- Updates all Start Menu shortcuts for that version
- Performs best-effort taskbar unpin/re-pin operations
The script outputs exactly one status line per year for Action1 reporting:
- INSTALLED
- SKIPPED
- DOWNLOAD FAILED
- ICON NOT AVAILABLE
No hardcoded Revit years are used. The script is safe to run on a schedule
and requires no maintenance when new versions are added.
.NOTES
Required Action1 Permissions:
- Run as System/Admin
- File System Access
Action1 Configuration:
- Script Type: PowerShell
- Execution Policy: Bypass
- No parameters required
Behavioral Notes:
- EXE icons are NOT modified (signature-safe)
- Taskbar pin changes are best-effort and per Windows limitations
- Exactly one output line is written per year
#>
$ProgressPreference = 'SilentlyContinue'
# ================================
# Script Constants
# ================================
$IconRoot = "C:\Autodesk\ICONS"
$BaseUrl = "https://copyparty.jam-fam.com"
$StartMenuRoot = "C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Autodesk"
New-Item -ItemType Directory -Path $IconRoot -Force | Out-Null
$Wsh = New-Object -ComObject WScript.Shell
$Shell = New-Object -ComObject Shell.Application
# ================================
# Dynamic Year Window
# ================================
$CurrentYear = (Get-Date).Year
$MinYear = $CurrentYear - 10
$MaxYear = $CurrentYear + 5
# ================================
# Main Script Logic
# ================================
foreach ($Year in $MinYear..$MaxYear) {
$IconFile = "r$Year.ico"
$IconUrl = "$BaseUrl/$IconFile"
$IconPath = Join-Path $IconRoot $IconFile
$RevitFolder = Join-Path $StartMenuRoot "Revit $Year"
# Check icon availability
try {
Invoke-WebRequest -Uri $IconUrl -Method Head -UseBasicParsing -ErrorAction Stop | Out-Null
}
catch {
Write-Output "[$Year] ICON NOT AVAILABLE"
continue
}
# Download icon
try {
Invoke-WebRequest -Uri $IconUrl -OutFile $IconPath -UseBasicParsing -ErrorAction Stop
}
catch {
Write-Output "[$Year] DOWNLOAD FAILED"
continue
}
# Check for Revit Start Menu folder
if (-not (Test-Path $RevitFolder)) {
Write-Output "[$Year] SKIPPED"
continue
}
$Shortcuts = Get-ChildItem $RevitFolder -Filter "*.lnk" -ErrorAction SilentlyContinue
if (-not $Shortcuts) {
Write-Output "[$Year] SKIPPED"
continue
}
# Update Start Menu shortcut icons
foreach ($Lnk in $Shortcuts) {
try {
$Sc = $Wsh.CreateShortcut($Lnk.FullName)
$Sc.IconLocation = "$IconPath,0"
$Sc.Save()
}
catch {}
}
# Taskbar handling (best-effort)
Get-ChildItem "C:\Users" -Directory -Exclude "Public","Default","Default User","All Users" | ForEach-Object {
$TaskbarPath = "$($_.FullName)\AppData\Roaming\Microsoft\Internet Explorer\Quick Launch\User Pinned\TaskBar"
if (Test-Path $TaskbarPath) {
Get-ChildItem $TaskbarPath -Filter "*Revit*$Year*.lnk" -ErrorAction SilentlyContinue | Remove-Item -Force
}
}
foreach ($Lnk in $Shortcuts) {
try {
$FolderObj = $Shell.Namespace((Split-Path $Lnk.FullName))
$Item = $FolderObj.ParseName((Split-Path $Lnk.FullName -Leaf))
$Item.InvokeVerb("taskbarpin")
}
catch {}
}
Write-Output "[$Year] INSTALLED"
}
Exit 0