Windows 10/11: Icon von Verknüpfungsdateien per PowerShell ändern

WindowsGelegentlich steht am als Nutzer oder Administrator vor der Aufgabe die Icons von Verknüpfungsdateien zu ändern. Bei ein oder zwei Dateien lässt sich dies manuell über deren Eigenschaften erledigen. Bei vielen Dateien kann die PowerShell zum Einsatz gelangen. Ein Blog-Leser hat mir ein entsprechendes Script zur Veröffentlichung bereitgestellt.


Anzeige

Eine Leseranfrage

Heute mal ein kleiner Tipp, der vielleicht dem einen oder anderen Administrator behilflich sein kann. Blog-Leser Antonius hatte mich vor einiger Zeit per Mail kontaktiert und gefragt, wie man eigentlich bei einer ganze Reihe Verknüpfungsdateien das Verknüpfungssymbol automatisiert anpassen könne.

Guten Tag Herr Born,

folgende dringende Frage zum Betriebssystem Windows10/11 haben wir.

Im Netz gibt es Anweisungen wie man per Hand ein Icon einer Verknüpfung (.URL bzw. .LNK-Datei) ändern kann.

Leider hilft uns das hier beschriebene manuelle Ändern der Icons bspw. für Desktop-Verknüpfungen (= .URL-Dateien) nicht weiter!

Wir benötigen einen automatisierten Weg das Icon von sehr vielen .URL-Dateien zu ändern.

Wenn Sie mehr als 200 .URL-Dateien haben, dann ist der oben beschriebene manuelle Weg sinnlos.

Wir benötigen quasi einen CMD-Befehl mit dem man das Icon einer bestehenden .URL-Datei auf ein anderes Icon (mit neue Pfadangabe des neuen Icons) ändern kann.

Wenn wir einen Befehl für die eine Datei haben, dann können wir eine FOR-Schleife bauen, die alle 200 .URL-Dateien ändern kann.

Wie können wir dies durchführen? Kennen Sie einen DOS-Befehl oder eine Batch-Datei?

Oder kennen Sie ein Programm oder eine andere Lösung unter Windows 10/11?

Für Ihre Unterstützung und Hilfe wären wir Ihnen dankbar.

Mir selbst war ad-hoc kein Programm und auch keine Lösung für diese Anforderung bekannt. Einen DOS-Befehl dazu gibt es meines Wissens nicht. Ich hatte zur Jahrtausendwende in meinen Windows Script Host-Büchern wohl mal entsprechende Ansätze mittels Windows Script Host und JScript zum Anpassen der Parameter einer Verknüpfungsdatei erwähnt, aber kein sofortige Lösung. Mir waren nur folgende Internet-Treffer bei einer kurzen Suche aufgefallen:

how to replace an existing url shortcut created on all desktop with a new url
How to create a desktop shortcut with the Windows Script Host

die irgendwie den Windows Script Host mit VBScript für die Manipulation von Shortcut-Dateien verwendeten. Allerdings ging mir im Kopf herum, dass die PowerShell vermutlich die bessere Lösung für diesen Zweck bereithält und hatte dem Blog-Leser diese Information mit einigen Links bereitgestellt.

Create Shortcuts .lnk or .url Files With PowerShell (PowerShell-Blogger)
Change .url shortcuts icon in PS? (reddit.com Post)
PowerShell:How can I change the icon of a shortcut to a custom icon file I have? (Spiceworks)


Anzeige

Die Lösung des Lesers

Blog-Leser Antonius hat sich dann die betreffenden Fundstellen angesehen und begonnen, ein PowerShell-Script, welches die Icons von mehreren Verknüpfungsdateien umsetzen kann, zu entwickeln. Als das Script stand, hat er nachgefragt, ob ich Interesse daran hätte. Ich stelle das Ganze hier AS-IS für die Leserschaft zur Verfügung:

#  Autor und Programmierer: Herr Antonios
#  Datum: 14.02.2024
#  PS-Skript zum massenhaften Ändern von URL-Datei-Symbolen (Icons) in einem Quellordner
#
#    FOLGENDE SCHRITTE SIND DURCHZUFÜHREN:
# 1. Anzupassen wäre im Skript individuell NUR der Wert der Variablen "$IconFile=".
#    Geben Sie dort den Pfad an, wo sich das neue Icon (sprich .ico-Datei) befindet.
# 2. Speichern Sie das Skript in dem Ordner ab, wo sich die zu ändernden .URL-Dateien befinden.
#    Als Skript-Name können Sie bspw. vergeben: "z_PS_Skript_massenhafte_Änderung_von_URL_Datei_Icons.ps1".
#
# 3. Führen Sie das Skript aus.
# 4. Um die neuen Icons zu sehen, melden Sie sich als Benutzer in Windows ab und wieder neu an ! 

CLS 

# Implementiert wird hier eine relative Pfadangabe, damit das PS-Skript in unterschiedlichen
# (Unter-)Ordnern ausgeführt werden kann.

$Pfad = '.\'
$DateiTyp = '*.URL'
$DateiPfad = $Pfad + $DateiTyp 
$IconFile = 'C:\Users\BENUTZERNAME\Dokumente\ICONS\NameNeuerIcon.ico'
$IconWert = 'IconFile=' + $IconFile
$regex = 'IconFile.*'

#Überprüfung, ob im Ausgangsverzeichnis mindestens eine *.URL Datei existiert
if ( !(Test-Path $DateiPfad) ) {
    Write-Host " Error: " `n "Es existiert keine *.URL-Datei im Ausgangsverzeichnis !! ==> Skript wird beendet." `n
    exit 1
}

#Sicherung aller Dateien des aktuellen Verzeichnisses'
$Sicherungsverzeichnis = '.\__SICHERUNG_ALLE_Dateien_VOR_LAUF_PowShl_Skript'
if (Test-Path $Sicherungsverzeichnis) {
    Write-Host "Verzeichnis existiert bereits !!"
    Write-Host "Eine Sicherung hat bereits zuvor stattgefunden. Eine neue Sicherung wird nicht angelegt!"
} else {
    Write-Host "Sicherungsverzeichnis existiert NICHT! "
    Write-Host "Neues Verzeichnis wird angelegt inkl. Sicherungsdateien."
    mkdir $Sicherungsverzeichnis
    copy .\*.* $Sicherungsverzeichnis
}

Echo `n
Echo "--- Phase Sicherung ist abgeschlossen ---"

# Ausgabe aktuelles Arbeitsverzeichnis
Echo `n "Ausgabe aktuelles Arbeitsverzeichnis:"
Get-Location
Echo ""
PAUSE

# Ab hier Änderung des Contents aller .URL-Dateien im aktuellen Verzeichnis
# Im Content soll der Wert für "IconFile=" geändert werden. Dieser soll auf 
# den Pfad des (neuen) Icons geändert werden.
Echo ""
Echo ""
Echo "*** Ausgabe ALLE .URL-Dateien die bearbeitet werden: ****"
$(dir $DateiPfad -file ).Name
Echo ""
PAUSE
Echo ""
Echo "==================================================================="
Echo "DURCHLAUF der FOR-Schleife - AUSGABE des Contents der URL-Dateien:"
$FileList = (dir $DateiPfad -file ).Name
foreach($a in $FileList) {
"Pfad:  " + $DateiPfad
"Datei: " + $a
Echo "---------------------------------------------------------------------"
Echo "==== ORIGINAL Inhalt der Datei $a "
Echo ""
Get-Content $a
Echo ""
Echo "-------------------------------------------------------------"
Echo "==== Durchführung der Änderung des IconFile in der Datei "
Echo ""
(Get-Content $a) -replace $regex, $IconWert | Set-Content $a
Get-Content $a
Echo ""
Echo "===================  Bearbeitung dieser .URL-Datei hier abgeschlossen  ==========================================="
Echo ""
}
Echo `n
Echo " ---- Skript Ende ---- "
Echo ""
Echo " ---- Melden Sie sich in Windows ab und wieder neu an !! ---- "
Echo `n
PAUSE

Blog-Leser Antonius schrieb mir: "Das PowerShell-Skript funktioniert einwandfrei. Und es muss nur einmal ausgeführt werden (nicht mehrmals)." An dieser Stelle mein Dank an den Leser, dass er seine Lösung der Leserschaft bereitstellt – vielleicht kann jemand das brauchen.


Anzeige

Dieser Beitrag wurde unter Software, Windows, Windows 10 abgelegt und mit , verschlagwortet. Setze ein Lesezeichen auf den Permalink.

4 Antworten zu Windows 10/11: Icon von Verknüpfungsdateien per PowerShell ändern

  1. DOM sagt:

    Verbesserungsvorschläge:
    1) nur *.url sichern
    2) nur über *.url iterieren
    3) echo durch Write-Host ersetzen, cls durch…

  2. js sagt:

    Hiho. Also ich persönlich finde es nicht so schön, CMD und Powershell zusammen zu werfen, aber das ist Geschmackssache. Ich habe es nicht getestet weil ich es nicht benötige.
    ABER:
    Wenn jemand keinen Bock auf Ab- und Anmelden hat und es gewohnt war, dieses leider nicht mehr existente "ie4uinit -show" für einen Icon-Refresh auszuführen, kann er ja Folgendes mit in das Skript einbauen:
    —snip—
    Add-Type @"
    using System;
    using System.Runtime.InteropServices;
    public class Shell32 {
    [DllImport("shell32.dll", CharSet = CharSet.Auto, SetLastError = true)]
    public static extern void SHChangeNotify(int wEventId, uint uFlags, IntPtr dwItem1, IntPtr dwItem2);
    }
    "@
    $SHCNE_ASSOCCHANGED = 0x08000000
    $SHCNF_IDLIST = 0x0000
    [Shell32]::SHChangeNotify($SHCNE_ASSOCCHANGED, $SHCNF_IDLIST, [IntPtr]::Zero, [IntPtr]::Zero)
    —snap—
    Vorsicht, das habe ich einfach so rein gepastet, keine Ahnung, was der Chat hier draus macht ;)

  3. Anonymous sagt:

    Mit etwas Rumprobieren habe ich es geschafft, dass Weblinks (.URL), die man von aus dem Sharepoint (direkt oder via Teams) im Webbroser geöffneten Office-Dokumenten generieren kann, sich beim Anklicken dann doch direkt in der Desktop-"App" öffnen, wenn man das so eingestellt hat (die Einstellung kann man zwar immer vornehmen, funktioniert aber bei Weblinks offensichtlich nicht):
    URL nach dem ? löschen und weiter vorne das /x/y:/ (mit x und y häufig unterschiedlich) entfernen.

    Leider haben die Verlinkungen dann das Browser/Edge-Icon… da hilft vielleicht obiges Script, sofern man die Powershell nutzen darf.

    Wenn ich manuell die dll oder exe vom betreffenden Officeprogramm nehme (das kann ich auch ohne Adminrechte), kann ich auch wieder ein schönes Icon vergeben. Leider ist dann im Pfad zur dll auch die Office-Version hinterlegt, d.h. beim nächsten Versionsprung dürften die Link-Icons gebrochen sein…

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Hinweis: Bitte beachtet die Regeln zum Kommentieren im Blog (Erstkommentare und Verlinktes landet in der Moderation, gebe ich alle paar Stunden frei, SEO-Posts/SPAM lösche ich rigoros). Kommentare abseits des Themas bitte unter Diskussion.

Du findest den Blog gut, hast aber Werbung geblockt? Du kannst diesen Blog auch durch eine Spende unterstützen.