Problem For-Schleife in Batch
Hallo,
ich bin bald am verzweifeln. Mit einer Batch bearbeite ich alle jpg`s in einem Verzeichnis. Es soll jede Datei angefasst werden, mittels ZBarimg der Barcode darin gelesen werden und die Datei anschließend umbenannt werden. Es hatte auch schon funktioniert. Auf einen Schlag geht es nicht mehr.
Folgende Zeile sollte den Barcode aus jeder Datei auslesen und in eine Variable schreiben:
Trennzeichen soll der Doppelpunkt sein (der ausgelesene Code sieht so aus: CODE-128:M2013-007826).
Wenn ich statt "%1" einen Dateinamen eingebe klappt es wunderbar.
Wo liegt da der Fehler?
Torsten
ich bin bald am verzweifeln. Mit einer Batch bearbeite ich alle jpg`s in einem Verzeichnis. Es soll jede Datei angefasst werden, mittels ZBarimg der Barcode darin gelesen werden und die Datei anschließend umbenannt werden. Es hatte auch schon funktioniert. Auf einen Schlag geht es nicht mehr.
Folgende Zeile sollte den Barcode aus jeder Datei auslesen und in eine Variable schreiben:
For /F "tokens=2 delims=':'" %%i in ('zbarimg "%1"') do Set "NEUERNAME=%%i"
Trennzeichen soll der Doppelpunkt sein (der ausgelesene Code sieht so aus: CODE-128:M2013-007826).
Wenn ich statt "%1" einen Dateinamen eingebe klappt es wunderbar.
Wo liegt da der Fehler?
Torsten
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 207973
Url: https://administrator.de/contentid/207973
Ausgedruckt am: 25.11.2024 um 17:11 Uhr
18 Kommentare
Neuester Kommentar
Hallo TorstenB!
Grüße
bastla
die Batch war in Ordnung.
... aber hinsichtlich der von colinardo angesprochenen Apostrophe definitiv suboptimal - ein Apostroph davon kann sinnvoll sein (falls er tatsächlich als Delimiter gelten soll), 2 brauchst Du aber sicher nicht, da die "delims
"-Angabe ohnehin nicht als String, sondern als Folge einzelner Trennzeichen interpretiert wird.Grüße
bastla
Hallo Torsten,
mach das nicht so umständlich. Es gibt da eine viel cleanere Methode den Output eines DOS-Befehls in VBS abzufragen:
Ich gehe hier nur einmal von einer Ausgabe-Zeile aus. Wenn die Ausgabe des Befehls anderst aussieht musst du sie hier posten dann passe ich es dir noch an.
Grüße Uwe
p.s. Diese Methode hatte ich dir hier auch schon mal gepostet
Vbs - Variable als Parameter an externes Programm übergeben und Rückgabewert in Variable schreiben
mach das nicht so umständlich. Es gibt da eine viel cleanere Methode den Output eines DOS-Befehls in VBS abzufragen:
Set objShell = CreateObject("Wscript.Shell")
'Befehl ausführen
Set oExec = objShell.Exec("cmd /c zbarimg Test-Datei.jpg")
'Warte darauf das der Befehl beendet wurde
Do While oExec.Status = 0
WScript.Sleep 100
Loop
' StdOut auslesen
out = ""
Do While Not oExec.StdOut.AtEndOfStream
out = out & oExec.StdOut.ReadAll
Loop
' zweites Token der ersten Zeile ausgeben, Delimiter ist ":"
MsgBox Split(out,":",-1,1)(1)
Grüße Uwe
p.s. Diese Methode hatte ich dir hier auch schon mal gepostet
Vbs - Variable als Parameter an externes Programm übergeben und Rückgabewert in Variable schreiben
Auch kein Hexenwerk
-edit- Code etwas angepasst
Set objShell = CreateObject("Wscript.Shell")
Set regex = CreateObject("vbscript.regexp")
regex.IgnoreCase = True : regex.Global = True
regex.Pattern = ":((B|E)\d{4}-[^\s]+)"
'Befehl ausführen
Set oExec = objShell.Exec("cmd /c zbarimg Test-Datei.jpg")
'Warte darauf das der Befehl beendet wurde
Do While oExec.Status = 0
WScript.Sleep 100
Loop
' StdOut auslesen
out = ""
Do While Not oExec.StdOut.AtEndOfStream
out = out & oExec.StdOut.ReadAll
Loop
Set matches = regex.Execute(out)
if matches.count > 0 then
for each match in matches
Msgbox match.submatches(0)
next
end if
-edit- Code etwas angepasst
Zitat von @goodbytes:
Hallo Uwe,
unsere Kommentare haben sich vorhin gerade überschnitten. Danke erstmal für deinen...
Über so einen regulären Ausdruck scheint es ja zu funktionieren. Was bedeuten die Parameter "regex.Pattern = ": (B|E)\d{4}-[^\s]+" im Detail?
Der Teil ": (B|E)" bedeutet ich suche nach dem Vorkommen ":B" oder ":E". Ist natürlich clever hier gleich den Doppelpunkt einzubringen, das erspart mir das zweite splitten.
Korrekt, Suche nach einem Doppelpunkt gefolgt von einem E oder BHallo Uwe,
unsere Kommentare haben sich vorhin gerade überschnitten. Danke erstmal für deinen...
Über so einen regulären Ausdruck scheint es ja zu funktionieren. Was bedeuten die Parameter "regex.Pattern = ": (B|E)\d{4}-[^\s]+" im Detail?
Der Teil ": (B|E)" bedeutet ich suche nach dem Vorkommen ":B" oder ":E". Ist natürlich clever hier gleich den Doppelpunkt einzubringen, das erspart mir das zweite splitten.
Herausfiltern kann ich den Doppelpunkt ohnehin danach dann mittels:
Das korrigiere ich oben noch mit einer Klammersetzung im Regex, hätte ich vergessen, dann ist das ausfiltern des Doppelpunktes nicht mehr nötig.Der String "-[^\s]" sagt dann sicher, dass ab dem Zeilenumbruch neu verglichen werden muss?
Nein, das bedeutet suche nach Bindestrich gefolgt von mindestens einem Zeichen was kein unsichtbares Zeichen (Leerzeichen/Zeilenumbruch/etc.) ist, damit diese nicht im String landen.Und was bedeutet "d{4}" und "+"?
\d{4} bedeutet suche genau nach einer Zahl und das genau 4 mal, das + ist ein Quantifizierungsoperator und sagt matche das vorherige Muster mindestens einmal, hier also "mindestens" ein Zeichen was kein unsichtbares Zeichen ist.Und weshalb ist es nicht möglich auf mehr Zeichen abzuprüfen, statt auf ":B" auf "B20"? Wenn ich es so mache: ": (B20|E20)\d{4}-[^\s]+" wird kein Vorkommen gefunden. Ich möchte nur weitestgehend garantieren, dass ich auch den richtigen String gefunden habe, da machen noch zwei Stellen mehr viel aus.
Das ist durch meine obigen Kommentare nun erledigt...Sorry, wenn ich deine Zeit dafür so beanspruche, aber ich möchte es natürlich gerne verstehen, was ja auch Sinn des Forums ist... Auf jeden Fall nochmal vielen vielen Dank für deine Hilfe...
Kein Problem.Aber einmal kurz in die Regular Expression Syntax Referenz geschaut hätte dir bestimmt auch geholfen den Pattern zu verstehen
Grüße Uwe
Nun muss ich also nur noch aufpassen, dass ich am Silvesterabend am 31.12.2099 nicht noch hektisch an meinen Rechner rennen muss weil ich vergessen hab das Script auf das neue Jahrhundert umzustellen... *lach*
Wenn, ja wenn dir die nette Pflegedame nicht die Feststellbremse an deinem Rollstuhl eingerastet hätte...