Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

Batch minimized command line. Compact syntax

Frage Entwicklung Batch & Shell

Mitglied: firebird3000

firebird3000 (Level 1) - Jetzt verbinden

26.02.2008, aktualisiert 27.02.2008, 12634 Aufrufe, 8 Kommentare

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?
@set !=||(set !=1&start "%~dpnx0" /min cmd /c %0 %*&set !=&goto :eof)

Ich verstehe die Syntax nicht. Das mit den Ausrufezeichen und den Gleichheitszeichen verstehe ich nicht.
Mitglied: miniversum
26.02.2008 um 14:36 Uhr
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:
@set !=||(...)
- Das @ heist nur das die Befehlszeile nicht angezeigt werden soll
- Mit set != Wird eine bestehen de Variable "!" gelöscht
- Das "||" bedeutet das das was dahinter steht (also das in der Klammer) ausgeführt wird wenn das Befehl vor der Klammer zu einem Fehler führt. D.h. in diesem Fall, sollte eine Variable mit dem namen "!" nicht existieren kann diese auch nciht gelöscht werden und dadurch werden die Befehle in der Klammer ausgeführt.

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
Bitte warten ..
Mitglied: firebird3000
26.02.2008 um 17:55 Uhr
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
@set !=||(set !=1&start "%~dpnx0" /min cmd /c %0 %*&set !=&goto :eof) , mitgegeben wurden.

Was ich mich dabei frage: warum wird die Batch Datei nochmal minimiert gestartet, um eine cmd aufzurufen, die dann nochmal das Programm startet?
Bitte warten ..
Mitglied: miniversum
26.02.2008 um 18:18 Uhr
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.
Bitte warten ..
Mitglied: firebird3000
26.02.2008 um 19:36 Uhr
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?
Bitte warten ..
Mitglied: miniversum
27.02.2008 um 09:17 Uhr
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.
Bitte warten ..
Mitglied: Biber
27.02.2008 um 10:53 Uhr
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:
01.
@set #=||(set #=1&start "%~dpnx0" /min cmd /c %0 %*&set #=&goto :eof)
Grüße
Biber
[Edit] Anmerkung auch in den wikibooks ergänzt. [/Edit]
Bitte warten ..
Mitglied: firebird3000
27.02.2008 um 12:13 Uhr
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:
01.
@set #=||(set #=1&start 
02.
> "%~dpnx0" /min cmd /c %0 %*&set 
03.
> #=&goto :eof) 
04.
> 

Danke, Biber.
Bitte warten ..
Mitglied: Biber
27.02.2008 um 13:07 Uhr
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).
01.
>for /l %i in (1,1,7) do @echo %random% !random! 
02.
11736 29003 
03.
11736 794 
04.
11736 16807 
05.
11736 20674 
06.
11736 3866 
07.
11736 27976 
08.
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
Bitte warten ..
Neuester Wissensbeitrag
Internet

Unbemerkt - Telekom Netzumschaltung! - BNG - Broadband Network Gateway

(3)

Erfahrungsbericht von ashnod zum Thema Internet ...

Ähnliche Inhalte
Batch & Shell
Dateinamen nach Zeichnen abschneiden - Batch-Shell (9)

Frage von cberndt zum Thema Batch & Shell ...

Batch & Shell
CMD Verschlüsslung ( Batch ) (11)

Frage von clragon zum Thema Batch & Shell ...

Batch & Shell
gelöst älteste dateien via batch löschen (6)

Frage von cali169 zum Thema Batch & Shell ...

Batch & Shell
gelöst Suchen und Ersetzen mehrerer Suchbegriffe per Batch (4)

Frage von makroll10 zum Thema Batch & Shell ...

Heiß diskutierte Inhalte
Windows Server
Outlook Verbindungsversuch mit Exchange (15)

Frage von xbast1x zum Thema Windows Server ...

Grafikkarten & Monitore
Tonprobleme bei Fernseher mit angeschlossenem Laptop über HDMI (11)

Frage von Y3shix zum Thema Grafikkarten & Monitore ...

Microsoft Office
Keine Updates für Office 2016 (11)

Frage von Motte990 zum Thema Microsoft Office ...