Ein Leser berichtete mir von seinen Erfahrungen mit Kommentaren in Batch:
REM ist gut, :: ist BÖSE!
Seine Erklärung dazu:
Grund: die ‚::‘-Kommentare sind syntaktisch anscheinend nichts anderes als Sprungmarken (die eben nie angesprungen werden). Funktioniert ja auch immer schön, und man kann sogar (vermeintlich) diese Sprungmarken doppelt definieren, also mehrfach denselben „Kommentar“ schreiben.
Probleme macht das aber in for-Schleifen. Konkret schicke ich dir mal ein Beispiel, bei dem die Meldung „Das System kann das angegebene Laufwerk nicht finden.“ erscheint.
Das wird noch viel lustiger, wenn man ein längeres Skript in dieser for-Schleife hat. Ich habe schon drei verschiedene sinnlose Fehlermeldungen wegen dieser Sache erhalten. War nicht leicht herauszufinden, was die Ursache war. Umstellen auf REM hat alle Probleme auf einmal behoben.
Hier der Start-Code für den Test:
@echo off for /f "tokens=*" %%a in (test.bat) do ( ::test ::echo echo %%a )
Diesen Code habe ich Stück für Stück verändert und mir die Resultate angesehen. Und diese waren, wie vom Leser berichtet, erstaunlich fehlerhaft:
Ausführungen:
- Start-Code wie oben mit ::test und ::echo
- nur ::echo
- nur ::test
- ohne ::test und ::echo
- ::test an verschiedenen Stellen zw. echo %%a und der schließenden Klammer
- ::test außerhalb der for Schleife
- ::test2 innerhalb der for Schleife
- ::test2 in ::test umbenannt
- ::test und eine leere Zeile davor
- ::echo hinzugefügt, ::test und ::echo innerhalb, Start-Code
- ::echo wieder entfernt, nur ::test
Also bei :: Kommentaren innerhalb der for Schleife kommt es unter Umständen zu Fehlern. Mal triggert ein :: Kommentar („test“ in diesem Fall) einen Fehler, mal nicht. Zukünftig werde ich alles mit REM auskommentieren.
Wie gut, dass ich bisher nur REM kannte. Und noch viel besser, dass ich eh keine Batch-Scripts mehr schreiben muss. 😀
Uff, gut zu wissen. Ich habe bisher immer den doppelten Doppelpunkt bevorzugt, weil er visuell besser ins Auge fällt und man so Kommentarzeilen schneller identifizieren kann. Und letztlich spart man ein Zeichen pro Kommentarzeile, aber da wollen wir mal nicht kleinlich sein. Werde jetzt mal meine ganzen Scripte checken und anpassen. Danke für die Info!
Ich sage mal so: es soll halt eher eine Warnung sein. Wenn deine Scripte bisher auch so funktioniert haben, musst du ja nicht zwangsläufig etwas ändern. Aber wenn du komische Fehler bekommst, for Schleifen benutzt und in den Schleifen Kommentare benutzt, wird dir das in Zukunft auffallen. Ich ändere jetzt, wenn ich Kommentare sehen, diese auf REM. Aber ich gehe jetzt nicht alle meine Scripte durch, das wäre etwas zu viel und wie gesagt, auch unnütz wenn sie denn funktionieren.
Für massenhaften Suchen und Ersetzen kann ich übrigens InfoRapid Search & Replace empfehlen, das macht sich ganz gut.
Ja da hast du natürlich recht. Bei mir sind es sowieso nur eine Handvoll Batch-Skripte, das ist schnell mit der Suchen-Ersetzen-Funktion vom Notepad++ erledigt. Ansonsten bin ich für das Skripten zum Großteil schon auf AutoIt umgestiegen.
AutoIt als Batch Ersatz? Interessant. Habe mal eben einen Blick in deinen Blog geworfen bzgl. AutoIt Posts, ich glaube da werde ich mal ein wenig stöbern.
Nutzt du AutoIt auch im Unternehmen bzw. in Windows Netzwerken und weißt, wie zuverlässig das ist? Wäre ja tatsächlich eine Überlegung die Scripte Stück für Stück in AutoIt zu schreiben.
Wobei, bevor ich diese Sprache komplett neu lerne, würde ich vermutlich gleich auf PowerShell umsatteln.
Ja ich nutze AutoIt bei uns im Unternehmen, sowohl auf Windows-PC als auch auf -Servern. Bisher hatte ich keinerlei Probleme bei der Ausführung von AutoIt-Skripten. Das läuft sehr zuverlässig. Wobei ich es mir erspart habe, auf sämtlichen Rechnern AutoIt zu installieren um die Skriptdateien direkt ausführen zu können. Ich lasse die Skripte immer zu ausführbaren EXE-Dateien kompilieren. Dann pfuscht mir da auch keiner einfach so im Code herum. Zur Laufzeit konfigurieren lassen sich die Skripte ja auch z.B. per Übergabeparameter oder INI-Dateien.
Ich hatte vor Jahren mal ein wenig mit PowerShell geskriptet. Mir gefällt aber die Abhängigkeit vom .NET-Framework nicht. AutoIt ist außerdem sehr leicht zu erlernen, da es die typische BASIC-Syntax nutzt, die man von Visual Basic oder VBScript kennt. Es gibt eine große Nutzergemeinde hinter AutoIt mit schon unzähligen vorgefertigten UDFs (user defined functions) für alle erdenklichen Aufgaben unter Windows. Ein gutes deutsches Einführungs-Tutorial findest du z.B. unter http://wiki.autoit.de/wiki/index.php/Tutorial