CMD.EXE versteht keine Unicode oder UTF-8 Batch Dateien

Ich habe für einen Deployment Prozess noch einen etwas größere komplexe Batch-Datei. Die BAT Datei enthielt auch zum Teil eben Umlaute die ja nicht ANSI sein dürfen. Zudem auch einige der Verzeichnisse neuerdings Umlaute enthalten, dachte ich mir: „Was soll es, Du speicherst das einfach als Unicode Datei!“ Die Vista CMD.EXE wird ja anhand der BOM erkennen was los ist.

😯 Pustekucken ❗ CMD.EXE mag in keiner Art und Weise Unicode oder UTF-8 in Batch-Dateien.

No chance at all. Einzig zur Unicode-Ausgabe kann man die CMD.EXE verleiten.
Eigentümlich ist das schon, weil TYPE z.B. BOMs korrekt berücksichtigt.

Da merke ich mal wieder wie verwöhnt ich mit 4NT bin.

PS: Ich weiß das es in Zeiten der Powershell andere Möglichkeiten gibt.
Man kann mich mit entsprechenden Kommentaren also gerne verschonen. 😉

Vista: Standby und Hibernate Probleme

Standby und Hibernate können eine endlose Geschichte des Leidens sein. Das liegt an sich nicht an Vista, unter Windows XP hatte ich auch immer wieder Ärger.
Hier mal wieder zwei neue Erfahrungen:

Problem 1:
Ich fahre meinen Rechner meistens mit Hibernate am Tagesende herunter. Warum Ausschalten, wenn eben alles was man braucht beim neuen Einschalten sofort da ist. Nun wachte mein Rechner jedoch nachts um Mitternacht oder etwas später sofort wieder auf. Morgens lief der Rechner und schaltete auch (wegen Problem 2) nicht in den Standby.
Ursache 1:
Ich hatte Nero 9 installiert. Und Nero 9 hat einen Task in der der Aufgabenplanung mit dem Namen NeroLiveEpgUpdate eingetragen. Dieser veranlasste aus irgend einem Grund im Hibernate auch das Aufwachen des Rechners.
Einfach diesen Eintrag deaktiviert und endlich blieb der Rechner ausgeschaltet wie ich es wollte.

Problem 2:
Mein Rechner ging nicht mehr in den Standby. Er schaltete einfach den Bildschirm ab und das wars.
Ursache 2:
Hier war es die Windows Media Player Freigabe. In den Energieoptionen existieren extra Einträge unter Multimediaeinstellungen ob ein Standby auch bei existierenden Freigaben erlaubt ist.
Nachdem ich die Freigaben im Windows Media Player entfernt hatte – die ich sowieso nicht nutzte –  funktionierte auch wieder der Standby.

DrawText unter Vista gegenüber XP um bis zu Faktor 50 langsamer!

❗ Ja Ihr habt ganz richtig gelesen und ich irre mich nicht ❗

Wir haben in einem unserer C++/MFC Programmen eine komplexe Anzeige von Reports, die alle unterschiedliche Zeilenhöhe haben und in einem speziellen Fenster angezeigt werden (eigene Entwicklung).
Nun stellten wir fest, dass das Rollen in diesem Programmteil auf Vista-Rechnern mit viel Nachlauf funktionierte und auch einige andere Operationen länger als gewohnt dauerten. Bei meinem Suchen, Profilen und Testen kam ich auf ein sehr lahmes Abarbeiten der Funktion DrawText  mit DT_CALCRECT.

Um das Problem zu isolieren schrieb ich ein kleines Testprogramm, das erstaunliches zu Tage brachte.
Hier die Ergebnisse von 4 verschiedenen Rechnern (Durchlauf von 100×100 DrawText Calls):

  • Pentium Quad-Core Q8200 mit Vista: 48.111 msec
  • Pentium Core2Duo T2310 mit Vista: 78.953 msec
  • Pentium Dual Core 3,2Ghz mit XP: 1.516 msec
  • Alter Pentium 3,0Ghz HT mit XP: 1.922 msec

😯 Der Code ist teilweise um den Faktor 50 langsamer auf Windows-Vista im Vergleich zu Windows-XP

Wer Lust hat es selbst zu testen, der findet hier das Beispielprogramm im Sourcecode (VS-2005):  TestDrawText.zip
Wer das Programm als Exe möchte findet es hier: TestDrawTextExe.zip

Beschreibung:
Dieses Beispielprogramm führt gemäß einem angegebenen Zähler je 100mal DrawText mit DT_CALCRECT für einen längeren mehrzeiligen Text aus. Hierbei werden immer zufällige Textlängen verwendet. Der Algorithmus liefert jedoch immer die gleiche Zufallssequenz, damit der Test auch Vergleichbar bleibt.
Der Zufallsmechanismus wurde nur eingebaut, um für für meinen Fall realitätsnahe Daten zu liefern.

Anmerkung:
Eine entsprechende Supportanfrage bei Microsoft läuft ❗
Was dabei herauskommt werde ich berichten…

Zuletzt angemerkt:
Windows 7 soll ja schneller sein als Windows Vista. Wer weiß? Ich habe es noch nicht getestet.
Vieleicht haben die nur diesen Bug gefixed und einen gigantischen Performanceschub erhalten :mrgreen: … SCNR…

Nachtrag (11.07.2009): 
Die Auiflösung zu diesem Problem findet sich hier in diesem Artikel 
http://blog.m-ri.de/index.php/2009/07/11/ausloesung-drawtext-unter-vista-gegenueber-xp-um-bis-zu-faktor-50-langsamer/

Schnell mal 7 neue Rechner einrichten… (klonen)

Das neue Jahr bringt manchmal neues, in meinem Fall neue Hardware.

7 baugleiche Rechner eines namhaften Herstellers wurden neu angeschafft um 7 ältere Rechner eines anderen namhaften Herstellers zu ersetzen.
Als Software sollten vorhandenen Volumenlizenzen für Vista Business und Office 2007 installiert werden zuzüglich einigen anderen Softwarepaketen.

Weder mein Kollege noch ich, hatten Lust jeden einzelnen Rechner individuell einzurichten, da 90% der Installation identisch sein wird. Also ging ich auf die Suche nach Software um die Rechner entsprechend zu klonen.
Der Weg über SYSPREP und Vista Deployment war mir zu komplex. Es mag einfach sein, dass es einfach ist, aber die Anleitung dazu war es nicht.

Als zufriedener Acronis-Nutzer bin ich dann schnell auf Acronis Snap Deploy 3.0 gestoßen. Diese Software kann weitaus mehr, als ich tatsächlich benötige, aber mit einer Lizenz und den einfachsten Installationsform konnte ich alles machen was ich wollte.

Der gesamte Weg lässt sich so kurz beschreiben:

  1. Mit dem Acronis Media Builder eine bootbare CD, mit dem Acronis Master Image Creator und dem Acronis Standalone Utility erzeugen.
  2. Einen Rechner komplett installieren mit allem was man braucht und haben möchte:
    Vista, aktuelle Treiber für die Hardware dieses Rechners, Office 2007, Nero 8 Essential, Visio 2007, eigene Software, Faktura, entsprechende Druckertreiber, diverse Freeware Tools etc.. Nicht zu vergessen natürlich auch alle Servicepacks und Security Updates durchlaufen lassen.
    Eben alles, was grundsätzlich auf diesen Rechner soll damit er lauffähig (benutzbar) ist.
  3. Dann habe ich einen neuen System-Wiederherstellungs-Punkt gesetzt und alle Wiederherstellungsdaten entfernt und auch das Laufwerk bereinigt um nicht überflüssige Daten zu clonen.
  4. Rechner herunterfahren.
  5. Externe USB-Platte angeschlossen.
  6. Mit bootbare Acronis CD und dem Acronis Master Image Creator gestartet.
  7. Image auf USB-Platte gezogen.
  8. Neuen Rechner starten mit bootbare Acronis CD und Acronis Standalone Utility starten.
  9. Image auswählen, Optionen für Netzwerk (Domäne, Rechnernamen) und ganz wichtig Neue SID erzeugen lassen.
  10. Image aufspielen (<12 Minuten).
  11. Rechner neu starten. Der erste Start dauert etwas länger wenn die Netzwerkeinstellungen und die SID angepasst werden).
  12. …und der Klon ist fertig 😉

Das ganze Verfahren ist so einfach, dass man wirklich kein spezielles Know How benötigt.
Genial einfach und wirklich preiswert ❗

PS: Ichhabe wirklich nur einen klitzekleinen Teil der Fähigkeiten von Snap Deploy verwendet, aber für mich war es genug.
Wer mehr will ist sicherlich auch extrem gut bedient, wenn man sich die weiteren Fähigkeiten dieses Tools ansieht…

Vista: Ausrufezeichen vor Microsoft WPD-Dateisystem-Volumen-Treiber im Gerätemanager

Es hat ziemlich lange gedauert bis ich verstanden habe woher das Ausrufezeichen vor dem Microsoft WPD-Dateisystem-Volumen-Treiber im Gerätemanager kommt.

Ich musste einige Siemens Rechner mit Vista neu ausstatten und habe einen Master erstellt um die anderen Rechner nur clonen. Irgendwann bei meinen Vorbereitungen erschien dann ein Ausrufezeichen vor dem Microsoft WPD-Dateisystem-Volumen-Treiber.

 wpd-dateisystem-volumentreiber

Irgendwann nachdem ich den Chipset Treiber aktualisierte und einige andere Änderungen gemacht hatte, erschien diese Anzeige. Ich machte die Änderungen langsam wieder rückgängig und fand dadurch den Grund.

Die Ursache ist ganz simpel. Meine Rechner verfügen auch über einen internen Speicherkartenleser. Dafür werden auch Laufwerksbuchstaben in der Datenträgerverwaltung reserviert. Mich nervt das regelmäßig, da ich maximal nur ein Laufwerk mit dem SD-Kartenleser nutze. Also entferne ich die Laufwerksbuchstaben für die anderen Kartentypen.
Aber genau das mag anscheinend der Treiber nicht.

Ordnet man allen Datenträgern wieder einen Laufwerksbuchstaben zu, verschwindet auch wieder das Ausrufezeichen. Also kein Grund zur Sorge und kein defekt. Einfach nur unschön.

PS: Bei den Rechnern, bei denen ich das beobachtete handelte es sich fast immer um Geräte mit Intel Chipsatz. Ich weiß nicht ob dies mit damit zusammenhängt.

Kann man mit einem Euro am Tag die Welt verändern?

Ja ❗

Zumindest für ein Kind in der Welt kann man mit einem Euro am Tag für eine gesicherte Schulausbildung, Ernährung und Gesundheitsfürsorge sorgen. Was sich mit diesem Euro für Kinder verändern kann ist unfassbar für uns Mitteleuropäer.

Wen das mehr interssiert, der sollte sich mal http://www.compassion-de.org ansehen ❗

Mein Blog ist 2 Jahre alt geworden + Gesegnete Weihnachtszeit + Ein gutes neues Jahr

Im Mitte Dezember 2006 hatte ich mir endlich die Zeit genommen diesen Blog einzurichten. Ich habe mit einigen Providern experimentiert bin aber dann schnell zu einer eigenen WordPress Installation gekommen, die ich ja auch immer noch erfolgreich verwende.

Schnell sind diese 2 Jahre sind vergangen und insgesamt 267 Beiträge wurden geschrieben. Und immer noch steigen die Zugriffszahlen langsam, aber stetig an, wenn ich der WordPress Blog-Statistik glauben darf. Ich hatte nicht gedacht, so viele Leser zu erreichen. Aber diese Bestätigung ist auch gut, denn was nützt ein Blog ohne Leser 😉

Allen regelmäßigen Kommentatoren sei hier auch einmal Dank für die immer guten und konstruktiven Beiträge.

Ich wünsche allen eine gesegnete Weihnachtszeit und ein gutes neues Jahr!

PS: In meinem Sidebar habe ich jetzt auch eine zusätzliche Combobox eingebaut, die es erlaubt weiter zurück in die Vergangenheit zu gehen als nur die bisherigen 18 Monate.

Lösung: Was ist falsch an diesem Code? (1)

Das Problem an diesem Code

On Error Resume Next
If MyFunction() Then
    MsgBox "MyFunction succedded"
Else
    MsgBox "MyFunction failed"
End If

MsgBox "... continue execution ..."

Function MyFunction
    MsgBox "Start MyFunction"
    On Error Goto 0
    ' Just a failure here
    i = 1/0
    MsgBox "End MyFunction"
    Test = true
End Function

ist, dass bei einem Fehler in der Funktion MyFunction die Funktion sofort abgebrochen wird. Nach diesem Fehler wird aber als nächste Zeile der Then Block ausgeführt. Die Funktion läuft also in den Bock „MyFunction succeeded“ was nicht unbedingt im Sinne des Erfinders wäre.

Der Entwickler hat zwei Dinge nicht bedacht:

  1. Er wollte, das ein Fehler in MyFunction das Skript terminiert. Das erreicht er aber nicht. MyFunction wird bei einem Fehler abgebrochen, aber On Error Resume Next im nächsten äußeren Scope behandelt den Fehler.
  2. Dem Entwickler war unklar, dass On Error Resume Next bei einem Fehler in einem If Statement zum Ausführen des Then Blocks führt ❗
    Und man kann sich Denken was passiert wenn man eine While MyFunction() Schleife hat? Jaaaaa genau! Wird in MyFunction ein Fehler ausgelöst hat man eine perfekte Endlosschleife!

Am Besten also die Funktion nicht im If-Statement ausführen sondern das Ergebnis in einer Variable Speichern. Sofern die Variable zuvor empty war, ist sie es im Falle ein Fehlers hinterher auch, d.h. sie wird nicht verändert. Nach der Funktion kann man dann zusätzlich auch Err.Number prüfen.

On Error Resume Next
Result = MyFunction()
If Result Then
    MsgBox "MyFunction succedded"
Else
    MsgBox "MyFunction failed"
End If

MsgBox "... continue execution ..."

Function MyFunction
    MsgBox "Start MyFunction"
    On Error Goto 0
    ' Just a failure here
    i = 1/0
    MsgBox "End MyFunction"
    Test = true
End Function

Und was lernen wir daraus ❓
On Error Resume Next ist tückisch und sollte möglichst sofort zurückgesetzt werden und schon gar nicht über den Scope einer eigenen Funktion hinaus verwendet werden.

Was ist falsch mit diesem Code? (1)

Ein Kollege hatte ein größeres Makro in VBScript geschrieben und ein interessantes Problem dabei entdeckt. Ich mache mal ein Ratespiel daraus 😉

Was ist faul mit diesem VBScript-Code?

On Error Resume Next
If MyFunction() Then
    MsgBox "MyFunction succedded"
Else
    MsgBox "MyFunction failed"
End If

MsgBox "... continue execution ..."

Function MyFunction
    MsgBox "Start MyFunction"
    On Error Goto 0
...
    MsgBox "End MyFunction"
    Test = true
End Function