firebird3000
Goto Top

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.

Content-ID: 81678

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

Ausgedruckt am: 22.11.2024 um 14:11 Uhr

miniversum
miniversum 26.02.2008 um 14:36:19 Uhr
Goto Top
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:
  • 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
firebird3000
firebird3000 26.02.2008 um 17:55:05 Uhr
Goto Top
Ja, das war schon sehr hilfreich.
Aber bei dieser Zeile verstehe ich den Sinn dieses Vorgangs nicht
start "%~dpnx0" /min cmd /c %0 %*
Ich schreibe mal, wie ich das verstehe:
Das "%~dpnx0" meint den kompletten Pfad und den Namen der aktuellen Batch Datei
und ist eine Erweiterung zu %0. Diese Batch wird gestartet und öffnet ein
Kommandozeilenfenster, das das aktuelle Programm per Namen (%0) aufruft mit allen
Parametern (%*), die schon beim ersten Starten der Batch Datei, in der diese Zeile steht

Was ich mich dabei frage: warum wird die Batch Datei nochmal minimiert gestartet, um eine cmd aufzurufen, die dann nochmal das Programm startet?
miniversum
miniversum 26.02.2008 um 18:18:43 Uhr
Goto Top
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.
firebird3000
firebird3000 26.02.2008 um 19:36:02 Uhr
Goto Top
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.
Ja, stimmt. Wegen den Anführungszeichen. Daran habe ich nicht gedacht.

Warum heißt es "%~dpnx0" und nicht "%~dp0" ?
Wofür ist das setzen der Variable != gut?
Warum wird die Variable ! mehrmals geändert?
miniversum
miniversum 27.02.2008 um 09:17:30 Uhr
Goto Top
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.
Biber
Biber 27.02.2008 um 10:53:05 Uhr
Goto Top
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:
@set #=||(set #=1&start "%~dpnx0" /min cmd /c %0 %*&set #=&goto :eof)  

Grüße
Biber
[Edit] Anmerkung auch in den wikibooks ergänzt. [/Edit]
firebird3000
firebird3000 27.02.2008 um 12:13:28 Uhr
Goto Top
Danke, miniversum.

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.
Ich habe ihn über seine Homepage aufgesucht und ihm eine E-Mail geschickt. Aber leider habe ich
noch keine Antwort erhalten. Dies geschah aber vor diesem Posting hier.

2) Aber erst dann, nachdem Du selbst
versucht hast es Dir selbst
aufzudröseln. Wie miniversum auch
geschrieben hat.
Die Grundbefehle sind mir auch bekannt, aber das mit den doppelten Pipes und deren Funktionsweise habe ich nicht gewusst.

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 /?"] ^
Ich wusste, dass man ein Ausrufezeichen statt eines % verwenden, aber wozu das gut ist, weiß ich nicht.


Dann lässt sich nicht mit einer
Variablen namens "!" arbeiten.
Besser also:
@set #=||(set #=1&start
> "%~dpnx0" /min cmd /c %0 %*&set  
> #=&goto :eof)
> 

Danke, Biber.
Biber
Biber 27.02.2008 um 13:07:51 Uhr
Goto Top
Moin firebird3000,

Ich wusste, dass man ein Ausrufezeichen statt eines % verwenden,
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