Perl

Zugriffe auf "%windir%\System32" und Unterverzeichnisse

03. September 2017 · Programmierung · andreas · Kein Kommentar

Einer der Gründe, warum in der EDV zeitliche Voraussagen so schwer zu treffen sind, ist die Tatsache, daß man immer wieder über Dinge stolpert, mit denen man nicht gerechnet hat.

Beim Versuch, ein Aufräumskript für die Hinterlassenschaften des AMD-Treibers in Perl zu schreiben, wurde eine Datei nicht gefunden, die laut Explorer und Eingabeaufforderung aber sehr wohl vorhanden war:

C:\Windows\System32\drivers>dir ati2erec.dll ... Verzeichnis von C:\Windows\System32\drivers 21.11.2014 04:08 43.520 ati2erec.dll 1 Datei(en), 43.520 Bytes

Die gleiche Aufgabenstellung als Perl-Skript

use strict; use warnings; if (-e 'C:\Windows\System32\drivers\ati2erec.dll') { print "found.\n"; } else { print "not found.\n"; }

führte aber zur überraschenden Ausgabe

not found.

Wie so oft, wenn es um seltsame Dinge in Windows geht, handelt es sich hierbei aber um ein Feature und keinen Bug, wobei das Feature aber erst einmal gefunden werden muß. Im konkreten Fall hört es auf den Namen “File System Redirector” und sorgt dafür, daß

In most cases, whenever a 32-bit application attempts to access %windir%\System32, the access is redirected to %windir%\SysWOW64.

Dies erklärt das obige Phänomen, da die verwendte Perl-Version eine 32-bit Anwendung ist. Freundlicherweise liefert der MSDN-Artikel auch gleich eine Lösung

32-bit applications can access the native system directory by substituting %windir%\Sysnative for %windir%\System32. WOW64 recognizes Sysnative as a special alias used to indicate that the file system should not redirect the access. This mechanism is flexible and easy to use, therefore, it is the recommended mechanism to bypass file system redirection.

so daß der Zugriff auf ‘C:\Windows\Sysnative\drivers\ati2erec.dll’ dann tatsächlich ein

found.

als Ergebnis liefert. Das “flexible and easy to use” möchte ich aber durchaus in Frage stellen, denn

Note that 64-bit applications cannot use the Sysnative alias as it is a virtual directory not a real one.

bedeutet letztendlich eine entsprechende Abfrage im Skript, damit - je nach verwendetem Interpreter - der Pfad entweder auf “System32” oder “Sysnative” gesetzt wird.


No type library matching "Microsoft Outlook" found

14. Juli 2016 · Programmierung · andreas · Kein Kommentar

office64_typelibFunktioniert in der Kombination mit einer 32-bit Microsoft Office-2013-Version die Zeile

use Win32::OLE::Const 'Microsoft Outlook';

problemlos, so wird sie bei einem installierten 64-bit Office mit folgendem Fehler quittiert:

# No type library matching "Microsoft Outlook" found at ... # Win32::OLE(0.1712): GetOleTypeLibObject() Not a Win32::OLE::TypeLib object at C:/Perl64/lib/Win32/OLE/Const.pm line 49

Eine längere Suche führte schließlich zum entscheidenen Hinweis: bei der 64-bit Installation wird der Schlüssel für die Typelib vom Office-Installer nur als “win64” gesetzt, Perl aber sucht nach einem “win32” Eintrag.

Ein Workaround ist somit recht einfach: unterhalb des Registrierungspfads

HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Wow6432Node\TypeLib

nach dem Eintrag für die “MSOUTL.OLB” suchen und passend zum “win64” Key händisch einen “win32” Key mit gleichem Inhalt erzeugen.


Installation des vSphere SDK for Perl Package unter Debian

17. November 2014 · Betriebssysteme · andreas · Kein Kommentar

Debian gehört nicht zu den standardmäßig unterstützten Plattformen für den Betrieb des vSphere SDK for Perl. Damit es trotzdem läuft, sind ein paar kleine Anpassungen nötig:

Als erstes sollte die im Paket enthaltene und zur Installation verwendete Datei “vmware-install.pl” modifiziert werden, welche im Zuge der Installation das verwendete Betriebssystem ermittelt und somit auch die zu verwendenden Systemwerkzeuge festlegt.

Nach einem

vi vmware-install.pl

reicht es, nach dem String “ubuntu” zu suchen und dessen zweites Vorkommen durch “debian” zu ersetzen.

Anschließend müssen noch die fehlenden Pakete

Archive::Zip 1.28 or newer Crypt::SSLeay 0.55 or newer Class::MethodMaker 2.10 or newer HTML::Parser 3.60 or newer Data::Dump 1.15 or newer SOAP::Lite 0.710.08 or newer URI 1.37 or newer XML::SAX 0.16 or newer XML::NamespaceSupport 1.09 or newer XML::LibXML::Common 0.13 or newer XML::LibXML 1.63 or newer LWP 5.805 or newer LWP::Protocol::https 5.805 or newer

nachinstalliert werden, damit die benötigten Abhängigkeiten erfüllt sind, was ein

apt-get install libssl-dev libarchive-zip-perl libcrypt-ssleay-perl libclass-methodmaker-perl libhtml-parser-perl libdata-dump-perl libsoap-lite-perl libxml-sax-perl libxml-libxml-perl libtime-duration-parse-perl

erledigt. Debian konform sollten die ausführbaren Dateien im letzten Schritt statt nach “/usr/bin” in das Verzeichnis “/opt/bin” kopiert werden.


Alle Jahre wieder

24. Dezember 2013 · Programmierung · andreas · Kein Kommentar

Allen Bloglesern ein entspanntes Weihnachtsfest und einen unfallfreien Rutsch in ein gesundes und glückliches 2014!

+ | / \ ( i ) /_ _\ ( i i ) /._ _.\ ( i i i ) /-._ _.-\ ( i i i i ) /'-._ _.-'\ ( i i i i i ) ^'-._ _.-'^ |_| andi 2oo4

Anbei noch ein Tannebäumchen, das ich 2004 außer Konkurrenz in Perl für den Weihnachtsbaum-Wettbewerb von Thomas Walter erstellt habe.

Wer das entsprechende Skript habem möchte - bitteschön!


XML-Dateien aufhübschen

19. Dezember 2013 · Programmierung · andreas · Kein Kommentar

Genau wie Maschinen oft Probleme haben, etwas für Menschen problemlos verständliches zu verarbeiten, so blickt ein Mensch dann und wann auf den Inhalt einer maschinenlesbaren Datei und kann darin nur wenig erkennen.

Geht es um die Verarbeitung von XML-Dateien, so können wenige Zeilen Perl eine deutliche Verbesserung schaffen - zum Beispiel bei der Aufbereitung einer “SEPA Payments"-XML-Datei.

pretty.pl
use strict; use warnings; use XML::LibXML; use XML::LibXML::PrettyPrint; my $file = $ARGV[0] || die "usage: pretty.pl inputfile.xml\n"; my $document = XML::LibXML->new->parse_file($file); my $pp = XML::LibXML::PrettyPrint->new( indent_string => chr(9), element => { compact => [qw/MsgId CreDtTm PmtInfId PmtMtd NbOfTxs CtrlSum Cd ReqdExctnDt Nm IBAN BIC ChrgBr EndToEndId InstdAmt Ustrd/], } ); $pp->pretty_print($document); open(sFILE, '>pretty-' . $file); print sFILE $document->toString; close (sFILE);

Die hauptsächliche Arbeit übernimmt das Modul XML::LibXML::PrettyPrint, dessen Ausgabe mit Hilfe einer Reihe von Parametern an die jeweiligen Bedürfnisse angepasst werden kann.