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
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
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 309398
Url: https://administrator.de/forum/batch-atset-und-atecho-in-for-schleifen-und-mehr-309398.html
Ausgedruckt am: 10.05.2025 um 22:05 Uhr
8 Kommentare
Neuester Kommentar
Hallo Ben.
Das @ Symbol unterdrückt die Ausgabe der Eingabeaufforderung für einen Befehl und das Kommando selbst, so wie es ein
Teste
direkt in einem CMD Fenster, mit und ohne @ vor dem
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):
Aber ich glaube das führt jetzt zu weit und verwirrt eher, als dass es dir hilft ... 
Grüße
rubberman
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
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
Grüße
rubberman
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
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
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
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
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
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
@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
- Notepad++ kann Syntaxhighlighting für Powershell-Code
- alternative zu Delphi: Lazarus/Freepascal
Gruß
Ankh