Gelegentlich 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
Verbesserungsvorschläge:
1) nur *.url sichern
2) nur über *.url iterieren
3) echo durch Write-Host ersetzen, cls durch…
Es kann sich jeder das PowerShell-Script nach eigenem Gusto optimieren. Ich stelle es hier as-is zur Verfügung, möchte da aber weder Support leisten noch ständig Korrekturen nachtragen.
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 ;)
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…