Variable und IF in einer Batchdatei gehen nicht

mayflower

Neu angemeldet
Registriert
13 Jan. 2016
Beiträge
32
Hallo,

ich habe wenig Erfahrung mit Batch, wollte aber in einem Skript erst eine Variable erstellen lassen und diese dann mit if prüfen. Laut einiger Beispielskripte sollte es so gehen:

[src=text]set var=1
IF "%var%" == "1" echo RICHTIG
pause[/src]

Es geht aber nicht. Trotz den "pause" verschwindet das Fenster gleich wieder, ich glaube dort Syntaxfehler erkannt zu haben. Das ist aber unlogisch, ich habe diese Bsp. in einigen Skripten gefunden. Ich weiß nicht was hier falsch sein soll. Ich hab auch alle Möglichen Abwandlungen mit ud ohne "" versucht - nichts geht. Wo liegt der Fehler?

mayflower
 
Servus mayflower,

zum einen solltest du dir eine cmd-box aufmachen, in das Verzeichnis der .bat gehen und dort einfach dann test.bat (oder ähnlich) aufrufen.
Dann bleibt das Fenster auch offen und du siehst den Fehler ;)

Korrekt ist:
[src=bash]@echo off
set var=1
IF %var% == 1 echo RICHTIG
pause[/src]

das @echo off steht da nur das er das Script beim ausführen auf der Befehlszeile wie oben angeraten nicht noch mal vollständig ausgibt.

"" gibt immer einen festen String an - das heißt du hast bei dir vergleichen ob die Buchstabenfolge (nichts mit Variablen) %var% gleich der Buchstabenfolge 1 entspricht. Die 1 gehört auch nicht in "" da du oben nicht den String 1 sondern die Zahl 1 gespeichert hast.

Aber wenn du nun eh bei 0 anfängst tu dir selber den Gefallen (außer du hast einen Grund der sich nicht Ändern lässt, z.B. Auftrag von Schule oder Arbeit) und lass das mit BATCH sein und lerne Powershell ...
Batch ist ein ca. 20 Jahre altes relikt das man gerne sterben lassen darf ;D
 
  • Thread Starter Thread Starter
  • #3
Danke, so gehts.

Ich wollte das ganze jetzt noch etwas abhängern indem ich durch if und else zwischen 2 Kommandozeilen unterscheide. Das ganze sollte so aussehen:

if %var% == 1 ( commandline1 ) else ( commandline2 )

Die auszuführende Kommandozeile ist eine die ich durch MKVMergeGUI habe erstellen lassen. Der Unterschied zwischen den beiden Zeilen ist das vorhandensein oder fehlen von bestimmten Audio- und Untertitelstreams. Leider geht das so nicht. Ich erhalte die Meldung

"bad/Staffel" kann syntaktisch an dieser Stelle nicht verarbeitet werden.

Das ist Teil des Output-Pfades "e:/breaking bad/staffel 1", also mit einem Leerzeichen drin. Was muss ich denn ändern, damit die Kommandozeile so ausgeführt wird wie sie dasteht? Sämtliche Pfade innerhalb der Kommandozeile stehen schon in "", die laufen auch außerhalb von if problemlos.
 
Dazu bräuchte ich schon das gesamte Script... und was warum willst du noch immer unbedingt Batch? ;D
 
  • Thread Starter Thread Starter
  • #5
if %var% == 1 ( mkvmerge ^"--ui-language^" ^"de^" ^"--output^" ^"E:/breaking bad/Staffel %staffel%/akte.x.s0%staffel%e0%folge1%.mkv^" ^"--language^" ^"0:eng^" ^"--default-track^" ^"0:yes^" ( ^"01-neu.mkv^" ) ^"--language^" ^"0:ger^" ^"--track-name^" ^"0:Deutsch^" ^"--default-track^" ^"0:yes^" ^"--forced-track^" ^"0:yes^" ( ^"01-deutsch.m4a^" ) ^"--language^" ^"0:ger^" ^"--track-name^" ^"0:deutsch^" ^"--default-track^" ^"0:yes^" ^"--forced-track^" ^"0:yes^" ( ^"01-df.idx^" ) ^"--language^" ^"0:ger^" ^"--track-name^" ^"0:deutsch^" ^"--default-track^" ^"0:no^" ( ^"01-dn.idx^" ) ^"--language^" ^"0:eng^" ^"--track-name^" ^"0:englisch^" ^"--default-track^" ^"0:no^" ( ^"01-eh.idx^" ) ^"--no-audio^" ^"--no-video^" ^"--no-subtitles^" ( ^"title01.mkv^" ) ^"--language^" ^"0:eng^" ^"--track-name^" ^"0:Englisch^" ^"--default-track^" ^"0:no^" ( ^"01-englisch.m4a^" ) ^"--split^" ^"frames:%schnitt1%^" ^"--title^" ^"^" ^"--track-order^" ^"0:0,1:0,6:0,2:0,3:0,4:0^" ) else ( mkvmerge ^"--ui-language^" ^"de^" ^"--output^" ^"E:/breaking bad/Staffel %staffel%/akte.x.s0%staffel%e0%folge1%.mkv^" ^"--language^" ^"0:eng^" ^"--default-track^" ^"0:yes^" ( ^"01-neu.mkv^" ) ^"--language^" ^"0:ger^" ^"--track-name^" ^"0:Deutsch^" ^"--default-track^" ^"0:yes^" ^"--forced-track^" ^"0:yes^" ( ^"01-deutsch.m4a^" ) ^"--language^" ^"0:eng^" ^"--track-name^" ^"0:Englisch^" ^"--default-track^" ^"0:no^" ( ^"01-englisch.m4a^" ) ^"--language^" ^"0:ger^" ^"--track-name^" ^"0:dummy^" ^"--default-track^" ^"0:yes^" ^"--forced-track^" ^"0:yes^" ( ^"dummy.srt^" ) ^"--language^" ^"0:ger^" ^"--track-name^" ^"0:deutsch^" ^"--default-track^" ^"0:no^" ( ^"01-dn.idx^" ) ^"--language^" ^"0:eng^" ^"--track-name^" ^"0:englisch^" ^"--default-track^" ^"0:no^" ( ^"01-eh.idx^" ) ^"--no-audio^" ^"--no-video^" ^"--no-subtitles^" ( ^"title01.mkv^" ) ^"--split^" ^"frames:%schnitt1%^" ^"--title^" ^"^" ^"--track-order^" ^"0:0,1:0,2:0,3:0,4:0,5:0^" )

und was warum willst du noch immer unbedingt Batch?

Was sollte ich denn sonst wollen? Ich kann kein Powershell. Alle Programme geben ihre Kommandozeilen weiterhin als Batchdatei aus und die laufen problemlos.
 
Du hattest ja geschrieben du lernst erst - und wenn man anfängt was zu lernen dann halt normal was aktuelles.
Die GUI gibt ja scheinbar nichts sinnvolles aus - jedenfalls denke ich nicht das der Befehl so wie du ihn gepostet hast ohne if %var% ... funktioniert.
Die ganzen klammern und ^zeichen kommen mir sehr Komisch vor.

Da macht es halt mehr Sinn sich die Anleitung des tool mkvmerge anzuschauen und die Commandline selber zusammen zu bauen und zu wissen was man tut.

Da wird irgendwas ge-escaped aber tut mir leid so ergibt für mich das gesamte ding keinen Sinn - mich wundert nur nicht sonderlich das es nicht funktioniert.
Nur kenne ich mkvmerge nicht und möchte es nun auch nicht lernen ;)

Es müssen / sollten nur Strings in "" die leerzeichen enthalten können - Befehle / Parameter gehören nicht in ""
 
  • Thread Starter Thread Starter
  • #7
Die Kommandozeilen von MKVMerge sind sehr komplex wenn man mehrere Streams einfügt (wie man oben sieht9. Das ist aber auch nicht das Problem: Die MKVMerge-Kommandozeile geht problemlos wenn ich sie alleine ausführe, es gibt nur Probleme wenn ich sie innerhalb dieser IF-Kommandozeile verwende. Jetzt mal unabhängig davon wie die MKVMerge-CLI aussieht: Es muss doch eine Möglichkeit zu sagen "wenn Variable1 = 1 dann führe Kommandozeile 1 aus, wenn Variable1 = 2 dann führe Kommandozeile 2 aus". Egal ob da Leerzeichen oder was weiß ich drin sind. Die Kommandozeilen alleine funktionieren ja wie schon gesagt.
 
ohne das ganze jetzt getestet zu haben...ich vermute das die Klammern das Problem sind. Diese werden vermutlich im Zusammenhang mit IF falsch interpretiert.
man kann Klammern benutzen um Blöcke zu bilden z.B.:

If [Bedingung] (
[Komando1]
[Komando2]
[Komando3]
)

Bei einem so komplexen Aufruf würde ich sagen trenne den abfrage vom Aufruf. Spring entweder zu einer bestimmten sprungmarke, ruf das als sub-script auf oder starte die Application über eine 2. Batch. Hauptsache du trennst deine IF-Abfrage von diesem ganzen Parmetern.
 
Zurück
Oben