Batch minimized command line. Compact syntax
Bei http://de.wikibooks.org/wiki/Batch-Programmierung:_Programmierungs_Hilf ... bin ich auf diesen Code gestoßen. Er startet die batch minimiert. Kann mir jemand sagen, wie der Aufbau funktioniert?
Ich verstehe die Syntax nicht. Das mit den Ausrufezeichen und den Gleichheitszeichen verstehe ich nicht.
Ich verstehe die Syntax nicht. Das mit den Ausrufezeichen und den Gleichheitszeichen verstehe ich nicht.
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 81678
Url: https://administrator.de/contentid/81678
Ausgedruckt am: 22.11.2024 um 14:11 Uhr
8 Kommentare
Neuester Kommentar
Das wirkt so kryptisch weil es so kompakt geschrieben ist.
Das Prinzip ist eigentlich sehr einfach. Ich zerlege jetzt den code in die einzelnen Bestandteile:
- Das @ heist nur das die Befehlszeile nicht angezeigt werden soll
- Mit set != Wird eine bestehen de Variable "!" gelöscht
set !=1&start "%~dpnx0" /min cmd /c %0 %*&set !=&goto :eof
Das sind eigentlich 4 Befehle di ein einer zeile stehen und nacheinander abgearbeitet werden.
set !=1
Die Variable "!" wird auf 1 gesetzt
start "%~dpnx0" /min cmd /c %0 %*
Dieser aufruf sorgt dafür das eine neue cmd minimiert gestartet wird und die Batchdatei selbst in diesem neuen Fenster ausgeführt wird. Da nun die Variable "!" schon gesetzt ist wird nicht nochmal einneues Fenster geöffnet weil die Klammer nicht ausgeführt wird.
set !=
Die Variable "!" wird wieder gelöscht
goto :eof
Es wird ans Ende Der Datei gesprungen. Das ist notwendig das die Batch dieim ersten cmd Fenster läuft nicht nochmal das gleiche danach ausführt.
Das ganze funktioniert halt nur solange es nicht aus irgent einem Grung auf den PC keine Umgebungsvariable mit dem namen "!" gibt. Was allerdings relativ unwahrscheinlich ist.
Das ganze also was nacheinander passiert:
Ichhoffe das war einigermasen veständlich erklärt?
miniversum
Das Prinzip ist eigentlich sehr einfach. Ich zerlege jetzt den code in die einzelnen Bestandteile:
- Mit set != Wird eine bestehen de Variable "!" gelöscht
set !=1&start "%~dpnx0" /min cmd /c %0 %*&set !=&goto :eof
Das sind eigentlich 4 Befehle di ein einer zeile stehen und nacheinander abgearbeitet werden.
set !=1
Die Variable "!" wird auf 1 gesetzt
start "%~dpnx0" /min cmd /c %0 %*
Dieser aufruf sorgt dafür das eine neue cmd minimiert gestartet wird und die Batchdatei selbst in diesem neuen Fenster ausgeführt wird. Da nun die Variable "!" schon gesetzt ist wird nicht nochmal einneues Fenster geöffnet weil die Klammer nicht ausgeführt wird.
set !=
Die Variable "!" wird wieder gelöscht
goto :eof
Es wird ans Ende Der Datei gesprungen. Das ist notwendig das die Batch dieim ersten cmd Fenster läuft nicht nochmal das gleiche danach ausführt.
Das ganze funktioniert halt nur solange es nicht aus irgent einem Grung auf den PC keine Umgebungsvariable mit dem namen "!" gibt. Was allerdings relativ unwahrscheinlich ist.
Das ganze also was nacheinander passiert:
- Batch wird gestartet im cmd Fenster 1
- Da die Variable "!" nicht gesetzt ist wird
- sie auf 1 gesetzt
- danach eine minimierte cmd inder die Batch selbst nochmal aufgerufen wird, die allerdings merkt das die Variable "!" schon gesetzt ist und daher mit dem Rest nach dieser Zeile weitergemacht wird
- die Variable "!" wird gelöscht
- und ans Ende der Datei gesprungen
Ichhoffe das war einigermasen veständlich erklärt?
miniversum
Es ist so das mit dem Start befehl Keine Batch dateien gestartet werden können. Daher cmd /c %0 %*. Das stellt also das zu startende Programm dar.
Um das minimiert hinzubekommen braucht man allerdings den Start-Befehl.
Der teil "%~dpnx0" ist nur ein Label. Also die bezeichnung die in dem minimierten Fenster in der Leiste oben steht. Man könnte es also auch durt "hallo du ich bin minimiert" ersetzen.
Um das minimiert hinzubekommen braucht man allerdings den Start-Befehl.
Der teil "%~dpnx0" ist nur ein Label. Also die bezeichnung die in dem minimierten Fenster in der Leiste oben steht. Man könnte es also auch durt "hallo du ich bin minimiert" ersetzen.
Bei "%~dp0" würde es dir nur das Laufwerk udn den Pfad anzeigen. Ist denke ich Geschmackssache was da angezeigt wird. Wenn das Fenster sowieso minimiert startet sieht man es normalerweise sowieso nicht.
Die Variable ! stellt einfach eine art merker dar. Die Batchdatei ruft sich ja selbst auf. Wäre dieser Merker nicht da würde sie immer wieder sich selbst starten bis ins unendliche. Daher wird in der Klammer die Batch selbst gestartet udn die Variable gesetzt, so das die zweite batch merkt das sie schon die minimiert gestartet ist und nicht nocheinmal sich selbst aufruft.
Vielleicht hilft es dir wenn du die befehle einzeln durchgehst und dir aufschreibst wie die variable in Welchem moment gesetzt ist um es nachvollziehen zu können.
Die Variable ! stellt einfach eine art merker dar. Die Batchdatei ruft sich ja selbst auf. Wäre dieser Merker nicht da würde sie immer wieder sich selbst starten bis ins unendliche. Daher wird in der Klammer die Batch selbst gestartet udn die Variable gesetzt, so das die zweite batch merkt das sie schon die minimiert gestartet ist und nicht nocheinmal sich selbst aufruft.
Vielleicht hilft es dir wenn du die befehle einzeln durchgehst und dir aufschreibst wie die variable in Welchem moment gesetzt ist um es nachvollziehen zu können.
Moin firebird3000,
drei Fussnoten zu diesem Beitrag.
1) Es ist nach meinem Empfinden immer der zweitbeste Weg, bei Fragen zu Lösungen aus anderen Foren (oder groups) diese hier abzustellen. Der Verfasser dieses Oneliners hat sich namentlich geoutet - dann solltest Du ihn fragen.
2) Aber erst dann, nachdem Du selbst versucht hast es Dir selbst aufzudröseln. Wie miniversum auch geschrieben hat.
3) Der Verfasser des Oneliners hat die Zeile nach eigenem Bekunden und meinen Englischkenntnissen "heute morgen schnell zusammengeschrotet".
Deshalb noch der Hinweis, dass diese Zeile NICHT funktionieren kann, wenn in der Registry "DelayedExpansion" (entgegen den M$-Ab-Werk-Einstellungen) aktiviert ist.
[ HKEY_CURRENT_USER\Software\Microsoft\Command Processor
DelayedExpansion REG_DWORD 0x1
siehe Hilfe "CMD /?"]
Dann lässt sich nicht mit einer Variablen namens "!" arbeiten.
Besser also:
Grüße
Biber
[Edit] Anmerkung auch in den wikibooks ergänzt. [/Edit]
drei Fussnoten zu diesem Beitrag.
1) Es ist nach meinem Empfinden immer der zweitbeste Weg, bei Fragen zu Lösungen aus anderen Foren (oder groups) diese hier abzustellen. Der Verfasser dieses Oneliners hat sich namentlich geoutet - dann solltest Du ihn fragen.
2) Aber erst dann, nachdem Du selbst versucht hast es Dir selbst aufzudröseln. Wie miniversum auch geschrieben hat.
3) Der Verfasser des Oneliners hat die Zeile nach eigenem Bekunden und meinen Englischkenntnissen "heute morgen schnell zusammengeschrotet".
Deshalb noch der Hinweis, dass diese Zeile NICHT funktionieren kann, wenn in der Registry "DelayedExpansion" (entgegen den M$-Ab-Werk-Einstellungen) aktiviert ist.
[ HKEY_CURRENT_USER\Software\Microsoft\Command Processor
DelayedExpansion REG_DWORD 0x1
siehe Hilfe "CMD /?"]
Dann lässt sich nicht mit einer Variablen namens "!" arbeiten.
Besser also:
@set #=||(set #=1&start "%~dpnx0" /min cmd /c %0 %*&set #=&goto :eof)
Grüße
Biber
[Edit] Anmerkung auch in den wikibooks ergänzt. [/Edit]
Moin firebird3000,
Kann ich vielleicht schnell zeigen (obwohl es bei dem Beispielschnipsel oben nicht verwendet wird).
Die Variable %random% wird einmal, beim Einlesen der auszuführenden Zeile aufgelöst.
Die Variable !random! wird verzögert, erst beim einzelnen Schleifendurchlauf aufgelöst und hat deshalb immer unterschiedliche Werte.
Grüße
Biber
Ich wusste, dass man ein Ausrufezeichen statt eines % verwenden,
aber wozu das gut ist, weiß ich nicht.
aber wozu das gut ist, weiß ich nicht.
Kann ich vielleicht schnell zeigen (obwohl es bei dem Beispielschnipsel oben nicht verwendet wird).
>for /l %i in (1,1,7) do @echo %random% !random!
11736 29003
11736 794
11736 16807
11736 20674
11736 3866
11736 27976
11736 12944
Die Variable %random% wird einmal, beim Einlesen der auszuführenden Zeile aufgelöst.
Die Variable !random! wird verzögert, erst beim einzelnen Schleifendurchlauf aufgelöst und hat deshalb immer unterschiedliche Werte.
Grüße
Biber