ben.blake.79
Goto Top

Batch: (at)set und (at)echo in For-Schleifen? und mehr

Hallo,

ich habe schon in einigen Beispielen in For-Schleifen gesehen, daß dort Variablen mit @set gesetzt wurden oder mit @echo ausgegeben. Habe dazu aber keine erklärung finden können...

Hat das einen bestimmten Grund? Eigentlich macht das @ ja nur die Eingabe unsichtbar und wenn echo sowieso auf off ist, wäre das doch überflüssig...

Gruß
Ben

Content-Key: 309398

Url: https://administrator.de/contentid/309398

Printed on: April 25, 2024 at 07:04 o'clock

Member: rubberman
Solution rubberman Jul 09, 2016 updated at 16:29:25 (UTC)
Goto Top
Hallo Ben.

Das @ Symbol unterdrückt die Ausgabe der Eingabeaufforderung für einen Befehl und das Kommando selbst, so wie es ein echo off global tut. Beides bezieht sich aber nicht auf bestimmte Befehle, wie set oder echo. Beispiele, die du gefunden hast, nehmen also vermutlich direkt Bezug auf Kommandozeilen, die in eine CMD Konsole eingegeben werden, statt dass sie in einem Batchscript stehen.
Teste
for /l %i in (1 1 10) do echo %i
direkt in einem CMD Fenster, mit und ohne @ vor dem echo... (Beachte, dass den FOR Variablen dort nur ein Prozentzeichen vorangestellt wird.)

Sobald also in einem Batchscript die Befehlsanzeige global ausgeschaltet ist, benötigst du das @ nicht zusätzlich. Ausnahme: Die Ausführung erfolgt im Kommandozeilenkontext innerhalb einer weiteren cmd.exe - Instanz. Bsp. (*.bat):
@echo off &setlocal
for /f "delims=" %%i in (  
 'for /l %%j in (1 1 10^) do @echo %%j'  
) do echo %%i
pause
Aber ich glaube das führt jetzt zu weit und verwirrt eher, als dass es dir hilft ... face-wink

Grüße
rubberman
Member: Ben.Blake.79
Ben.Blake.79 Jul 09, 2016 updated at 16:44:10 (UTC)
Goto Top
Danke,

ich hab nochmal geschaut, und was ich gefunden hab, ist definitiv nicht für die Komandozeile gedacht (For-Variable %%i) - dann machte der jenige welche wahrscheinlich nur viel mit der Zeile und setzt das @ aus Gewohnheit. Das erklärt auch warum ich es (ich würde sagen nur) bei Schleifen gefunden habe, dort würde er ja den ausgeführten Befehl nochmal ausgeben...

Brauch ich mir also darüber keine Gedanken machen, ich hatte nur gedacht, das wäre irgendein Sonderfall.

Wenn es da aber noch was zusätzliches gibt - so leicht bin ich nicht zu verwirren ;).
Vielleicht weißt Du ja, wo das erklärt ist, um hier keine Romane schreiben zu müssen? Oder meinst Du einfach, daß bei einer weiteren bat als z.B. Unterprogramm, die eine neue Konsole aufruft, die Einstellung dann weg ist und er wieder mit "echo on" weitermacht, außer man setzt dort echo wieder auf off? Davon wäre ich jetzt ohnehin mal ausgegangen...

Gibt es eigentlich eine Hilfeseite nur zu Syntax-Fragen? Ich bin mit batch-Programmierung eigentlich ziemllich weit, so daß jedes 08/15-Tut mir nicht wirklich hilft. (Erst recht nicht, wenn es da nur um triviale Fragen geht und Sonderfälle ausgespart werden.) Da ich mir das alles aber so nach und nach angeeignet habe, gibt es da schon die eine oder andere Lücke (manche halt auch bei den Grundlagen), wo es gut wäre, mal schnell nachschlagen zu können...
Member: rubberman
rubberman Jul 09, 2016 at 18:33:34 (UTC)
Goto Top
Der Umfang von Batch ist wirklich nicht so riesig, als dass man ihn sich nicht autodidaktisch aneignen könnte. Nichts anderes habe ich auch gemacht. Da die Möglichkeiten von Batch als Sprache und die der Kommandozeilentools sehr beschränkt sind, läuft das dann teilweise darauf hinaus, Befehle für Dinge zu nutzen, für die sie nicht gedacht sind und jede mögliche Art von Bug und undefiniertem Verhalten als zusätzliches Feature zu nutzen face-wink Darüber wirst du natürlich keine offizielle Dokumentation finden, aber im Internet zu stöbern hilft oft. Naja ... man sollte dann wohl mal kritisch hinterfragen, wo andere Sprachen geeigneter wären.

Wie gesagt, dein obiges Problemchen war schnell erklärt. Wann Befehle in einer zusätzlichen cmd.exe Instanz und im Kommandozeilenkontext statt im Scriptkontext ausgeführt werden, ist nur dann eindeutig wenn du explizit cmd /c aufrufst. Ansonsten sind Aufrufe innerhalb einer FOR /F Schleife (wie oben gezeigt) oder Pipes ein Indiz dafür, dass das so sein könnte. Mit einem Prozessexplorer siehst du es genauer.

Auch undokumentiert und nur durch eigene Versuche herauszubekommen:
How does the Windows Command Interpreter (CMD.EXE) parse scripts?
Vielleicht interessiert es dich ja ...

Grüße
rubberman
Member: Ben.Blake.79
Ben.Blake.79 Jul 10, 2016 at 10:01:58 (UTC)
Goto Top
Danke, sieht sehr interessant aus...

Mein Problem ist, daß ich zwar vor über 20 Jahren mal Turbo Pascal und ein bisschen Basic gelernt habe, aber da ich es nie wirklich gebraucht habe... Und als altes DOS-Kind bin ich halt mit den DOS-Befehlen vertraut, habe sie immer mal wieder benutzt und daher eine ziemlich gute Grundlage...
Außerdem bin ich schon ziemlich kreativ und habe ein gutes Verständnis dafür, wie ein Computer arbeitet und ein Programm funktioniert. Nur bei allem objektbasierenden bin ich ziemlich unbeleckt...

Woran ich gerade sitze ist schon ziemlich anspruchsvoll ( Skripts um die inis von XCom2-Mods zu sammeln; die welche zusätzlich vom Nutzer bearbeitet werden aus der blöden Steam-Workshop-Struktur lösen, zentral ablegen und bei Updates Backups erstellen und entsprechend hinzuweisen, um zu Vermeiden, daß die Updates unerkannt persönliche Einstellungen überschreiben, andererseits aber auch Neuerungen nicht verloren gehen; Standard-inis vereinigen, Nicht-standard-inis als geänderte Versionen in die Mod-Verzeichnisse kopieren und noch ein paar andere Kleinigkeiten...) überprüfen und da sind mir eben etliche Wissens/Verständnisücken aufgefallen. Daß ich das eine oder andere mir überhaupt erstmal anschauen mußte, war klar, aber einige Sachen waren auch Überraschungen, wo ich dachte, da weiß ich bescheid...

Aber soweit ich mir das angeschaut habe, ist alles mit Batch machbar und in Rohversionen sind die auch alle fertig - jetzt geht es nur noch ums Tuning und noch ein paar Funktionen.

Ich denke auch, das ist eine gute Basis, um andere Sprachen zu lernen, falls ich dazu Lust und Bedarf habe. Ich dachte da an VB aber vielleicht hast Du da bessere Vorschläge? Hängt auch ein bisschen davon ab, ob ich den Bedarf sehe, andererseits gibt es etliche Sachen, wo es mich ärgert, daß es dafür kein Tool gibt...
Member: rubberman
rubberman Jul 10, 2016 at 10:41:55 (UTC)
Goto Top
Batch ist leider keine Basis für irgend eine andere Sprache, soviel kann ich aus eigener Erfahrung sagen. Im Gegenteil. Wer sich daran gewöhnt hat mit GOTO unlesbaren und unwartbaren Spaghetticode zu schreiben (was übrigens auch mit Batch anders ginge), wird die größten Probleme haben, auf andere Sprachen umzusteigen.
Wenn du bei Scripts bleiben willst, schau dir die PowerShell an. Damit hast du Zugriff auf das gesamte Repertoir von .NET. VB wird langsam aussterben. Wenn, solltest du dir C# ansehen. Beide bauen wieder auf .NET auf, wobei sich die Syntax von C# zu Basic oder Turbo Pascal ziemlich stark unterscheidet. Vielleich doch lieber VB ... hmmm. Ich selbst habe mich für C entschieden, da auch die Windows API im C-Style vorliegt. Seit einiger Zeit beschäftige ich mich auch mit C++, wo noch mal Welten dazwischen liegen.

Wie auch immer, Arbeiten im Dateisystem werden mit Batch sicherlich machbar sein. Wenn du INI Dateien damit ändern willst, halte ich Batch aber bereits für ungeeignet.

Grüße
rubberman
Member: Ben.Blake.79
Ben.Blake.79 Jul 10, 2016 updated at 10:57:13 (UTC)
Goto Top
Ich meinte auch VB.NET, oder gilt das auch dafür?
Lassen sich mit Powershell unabhängig ausführbare Dateien erstellen?
Und wichtiger, gibt es einen Editor, der es richtig gut und mit anpassbaren Farben darstellt, bzw. wie gut ist die Sprach-Einstellung von Notepad++? Für Batch geht es, aber es gibt ein paar Lücken, ist aber besser als alles was ich sonst probiert habe (Klammern und Anführungszeichen, vielleicht hast Du da ja auch eine Idee? Die Suche nach einer vergessenen Klammer hat mich letzte Nacht 3 Stunden gekostet...). Als ich eine eigene Sprach-Einstellung gabastelt habe, ist die bei Schleifen usw. ausgestiegen, das ließ sich wegen der irgendwie wegen den Rangfolgen nicht einbauen...

Gruß
Ben

ps: Ich will die inis nicht bearbeiten, sondern nur die Dateien verschieben und die Standards "mergen". Ein Programm, was dann die Einstellungen komfortabel Präsentiert, wäre ein nächster Schritt - den hatte ich aber nicht mit batch vor, da hab ich mir noch keine richtigen Gedanken gemacht, müßte dann auch in einer Windows-Oberfläche laufen...
Member: rubberman
rubberman Jul 10, 2016 at 11:07:05 (UTC)
Goto Top
Ich meinte auch VB.NET, oder gilt das auch dafür?
Ja. Eine weitere Alternative (bzgl. Turbo Pascal) wäre Object Pascal (besser bekannt als Delphi).

Lassen sich mit Powershell unabhängig ausführbare Dateien erstellen?
Ähm. Worauf willst du hinaus? PowerShell Scripts liegen, wie andere Scripts auch, in Plaintext Dateien.

Und wichtiger, gibt es einen Editor, der es richtig gut und mit anpassbaren Farben darstellt, bzw. wie gut ist die Sprach-Einstellung von Notepad++?
Windows hat die PowerShell ISE an Bord. Syntaxhighlighting gibt es für eine Reihe von Editoren, also sicher auch für Notepad++ (hab's aber gerade nicht istalliert).

Die Suche nach einer vergessenen Klammer hat mich letzte Nacht 3 Stunden gekostet
Richtige Codeeinrückung ist dafür die Lösung (für so ziemlich jede Sprache übrigens).

Grüße
rubberman
Member: AnkhMorpork
AnkhMorpork Jul 11, 2016 at 06:09:03 (UTC)
Goto Top
@rubberman hat ja bereits alles erwähnenswerte geschrieben. Dazu noch 2 Ergänzungen:

- Notepad++ kann Syntaxhighlighting für Powershell-Code

- alternative zu Delphi: Lazarus/Freepascal

Gruß

Ankh