Schneller Directory-Zugriff via Netz in PowerShell

Wer schon etwas intensiver mit der PowerShell gearbeitet hat, kennt das Problem wahrscheinlich: Beim Zugriff auf Directory-Informationen via Netz d.h. bei Netzlaufwerken kann sie quälend langsam sein. Bei einem Befehl wie z.B. dir y:/texte/*power* kann es mehrere Sekunden dauern, bis das Auslisten der passenden Filenamen beginnt, und file name completion ist ebenfalls oft an der Schmerzgrenze, was die Ausführungszeit anbelangt, sobald Netzlaufwerke im Spiel sind.

Als ich neulich einen Server unter Windows Server 2008 R2 neu aufgesetzt habe, ist mir aufgefallen, dass sich dieses Problem dankenswerterweise in Luft aufgelöst hat. Ich habe mal recherchiert, was es damit auf sich hatte und wie es nun gelöst wurde:

Im Artikel Why is Get-ChildItem so Slow? sind die Gründe recht anschaulich erklärt. Einer davon hat mit der Objekt-Hierarchie des .NET Framework im Bereich der Klassen von System.IO zu tun: Gewisse Informationen, welche die PowerShell gar nicht benötigt, werden zeitaufwendig immer via Netz ermittelt, ohne dass die PowerShell etwas dagegen tun kann, weil das Ganze rein klassenintern abläuft. (Das ist eine Art von Problem, die wohl jedem vertraut ist, der schon mal so etwas wie ein „Framework“ gebaut hat.)

Entsprechend besteht die Lösung nicht in einer verbesserten Programmierung innerhalb der PowerShell, sondern in Erweiterungen im .NET Framework, welche für die Version 4 tatsächlich erfolgt sind, wie man hier nachlesen kann. Die konkreten neu in diesem Zusammenhang angebotenen Methoden beschreibt die MSDN Library im Artikel How to: Enumerate Directories and Files.

Etwas ist allerdings ein wenig seltsam: Gemäss der Information hier umfasst Windows Server 2008 R2 das .NET Framework in Version 3.5.1, nicht in Version 4. (Version 4 ist ja im Moment erst im Beta-Stadium.) Vielleicht hat da Microsoft der PowerShell zuliebe heimlich einer paar 4er-Verbesserungen reingemogelt…

Was ich bei meinen Abklärungen auch noch gefunden habe, ist dieser Blog-Eintrag von jemandem namens Tom Shelton, der mittels WIN32-API-Aufrufen und Extension Methods zur Selbsthilfe gegriffen hat und Directory-Zugriffe für Netzlaufwerke bereits heute im ganz normalen .NET Framework 3.5 mit guter Performance hinkriegt.

Veröffentlicht in Keine Kategorie. Schlagwörter: , . Leave a Comment »

Schreibe einen Kommentar

Trage deine Daten unten ein oder klicke ein Icon um dich einzuloggen:

WordPress.com-Logo

Du kommentierst mit Deinem WordPress.com-Konto. Abmelden / Ändern )

Twitter-Bild

Du kommentierst mit Deinem Twitter-Konto. Abmelden / Ändern )

Facebook-Foto

Du kommentierst mit Deinem Facebook-Konto. Abmelden / Ändern )

Google+ Foto

Du kommentierst mit Deinem Google+-Konto. Abmelden / Ändern )

Verbinde mit %s

%d Bloggern gefällt das: