You are here: Wissensbasis Web>WindowsShortcutEditieren (2003-11-06)

Windows Verknüpfungen mit Win32::Shortcut editieren

Inhalt:

Vorwort

Windows Verknüfpfungen, lassen sich nicht so einfach auslesen und bearbeiten wie z.B. Favoriten (.url).
Doch dank des Moduls Win32::Shortcut (Im Standardumfang von ActivePerl vorhanden) ist dies möglich. Ich möchte dir die Funktionsweise des Moduls anhand einiger Beispiele erläutern:

Daten auslesen

In dem folgenden Beispiel lesen wir den Ziel-Pfad, den Dos-kompatiblen Ziel-Pfad und das Arbeitsverzeichnis aus einer Testverknüpfung aus.

Verknüpfung auslesen
use strict;
use warnings;
use Win32::Shortcut;

# Testverknüpfung zu Perl
my $verkn = 'c:\\temp\\test.lnk';

# Objekt aus Klasse Win32::Shortcut erstellen
my $sc = Win32::Shortcut->new();

# Durch Aufruf der Methode "Load" die Datei dem Modul übergeben
$sc->Load($verkn) or die "Konnte Verknuepfung nicht laden: $!";

# Pfad (lang) ausgeben
print $sc->Path(),"\n";

# Pfad (kurz, kompatibel zur DOS-Box) ausgeben
print $sc->ShortPath(),"\n";

# Arbeitsverzeichnis ausgeben
print $sc->WorkingDirectory(),"\n";
__END__
C:\Perl\bin\perl.exe
C:\Perl\bin\perl.exe
C:\Perl\bin

Daten ändern

Jetzt haben wir schonmal ein paar Daten aus der Verknüpfung ausgelesen.
der nächste Schritt ist, Daten einer Bestehenden Verknüpfung zu ändern.
z.B.: Ein anderes Icon für die Verknüpfung festlegen:

Icon von Verknüpfung ändern
use strict;
use warnings;
use Win32::Shortcut;

# Testverknüpfung zu Perl
my $verkn = 'c:\\temp\\test.lnk';

# Objekt aus Klasse Win32::Shortcut erstellen
my $sc = Win32::Shortcut->new($verkn);

# Das Laden haben wir jetzt implizit mit der methode new erledigt

# Festlegen woher das Icon kommt
# (In der Regel .ico und .exe und Windows-Standard .dll Dateien)
my $iconpath = 'C:\\WINDOWS\\system32\\SHELL32.dll';

# Die Iconnummer (muss man am besten ausprobieren da
# Die Art wie die Icons gezählt werden vom Betriebssystem abhängt
my $iconnumber = 13;

# Werte an das Objekt übergeben
$sc->IconLocation($iconpath);
$sc->IconNumber($iconnumber);

# Und in Verknüpfung zurückspeichern
$sc->Save() and
print "Wenn es es XP ist, sollte die Verknüpfung ein Symbol als Weltkugel haben.\n";
__END__
Wenn es es XP ist, sollte die Verknüpfung ein Symbol als Weltkugel haben.

Wow jetzt können wir also schon Verknüpfungen anpassen.
Genau so verhält es sich auch, wenn man eine neue Verknüpfung erstellen möchte. Mit dem kleinen Unterschied, dass man die Datei nicht der Klasse übergibt (lädt) sondern das Objekt leer erstellt, die Werte zuweist und dann der Methode "Save" den Dateinamen übergibt: $sc->Save($verkn);.

Prüfen ob Ziel existiert und versuchen es zu finden

In dem nächsten Beispiel wollen wir aus dem Aktuellen Verzeichnis alle Links einlesen, prüfen ob die Datei existiert. Wenn sie nicht existiert, soll Win32::Shortcut versuchen die Zieldatei zu finden.

Zielauflösungsversuch
use strict;
use warnings;
use Win32::Shortcut;
use File::Find;

# Suchen nach allen *.lnk Datei im aktuellen Verzeichnis (rekursiv)
# Und über gib diese an die Funktion check_sc
find(sub {check_sc($File::Find::name) if /\.lnk$/},'.');


sub check_sc ($) {
  # Dateinamen in Varialbe speichern
  my $file = shift;

  # Neues Objekt mit dem Inhalt von $file erstellen
  my $sc = Win32::Shortcut->new($file);
  
  # Wenn das Ziel nicht existiert
  unless (-e $sc->Path()) {
    print "Versuche Ziel wieder zu finden\n";
    
    # Merken des momentanen Pfades
    my $oldpath = $sc->Path();

    # Versuchen eine Alternative mittels der Mehthode "Resolve" zu finden...
    my $newpath = $sc->Resolve();
    
    # Wenn erfolgreich...
    if ($newpath ne $oldpath) {
      print "Alternative gefunden: $newpath\n";

      # Setzten des neues Wertes...
      $sc->Path($newpath);

      # Und speichern
      $sc->Save();
    }
    else {
      # Ansonsten Meldung
      print "Keine Alternative für $file gefunden\n";
    }
  }
  else {
    # Wenn Ziel existiert -> Meldung
    print "Verknüpfungsziel existiert\n";
  }
}


__END__
Verknüpfungsziel existiert
Versuche Ziel wieder zu finden
Alternative gefunden: C:\Temp\functions.js
Verknüpfungsziel existiert
Verknüpfungsziel existiert

Ich hatte vier Verknüpfungen in dem Verzeichnis und von einem manuell das Ziel umbenannt. Die Ausgabe des Programmes sagt eigendlich alles.

Nachwort

Jetzt können wir schon richtig was anfangen mit so einem kleinen Programm. z.B.: Mal alle Links auf unserem Rechner aufräumen wink

Dieses Tutorial bezieht sich auf die offizielle Dokumentation von Win32::Shortcut auf CPAN

-- AlexKoeppe - 27 Aug 2003
Topic revision: r4 - 2003-11-06 - 10:08:02 - AlexKoeppe
 
Bitte die NutzungsBedingungen beachten.
Bei Vorschlägen, Anfragen oder Problemen mit dem PerlCommunityWiki bitten wir um WebBottomBarExample">Rückmeldung.