chainsaw
Goto Top

Fortlaufend umbenennen - Frage dazu

Hallo Profis,

Ich hänge bei einem Batch und komme nicht weiter. Vielleicht könnt ihr mir helfen.

Folgendes Vorhaben möchte ich mit Batch realisieren:
Ich habe Filme von meinem Festplattenreceiver auf den PC überspielt. Diese wandle ich mit der Software "PVA-Strumento" in ein PVA-File
damit ich sie weiterverarbeiten kann. Bei PVA-Strumento kann man nun ein Jobfile erstellen das ich per Batch aufrufe.

Bisher habe ich immer nur ein Filmfile verabeitet. Jetzt möchte ich das ganze soweit optimieren, dass mehrere Filme nacheinander
abgearbeitet werden. Das funktioniert soweit ganz gut, allerdings gibts ein Problem bei der umbenennung der fertigen Dateien.

Diese landen im Verzeichnis "c:\Temp\003_PVA_OUT" und heißen immer "film_00.pva". Wenn nun der erste Film im Out-Verzeichnis liegt
wird dieser in Titel_01 umbenennt, der zweite soll dann Titel_02 usw. heißen, je nachdem wieviele Dateien eben abgearbeitet werden.

Da liegt nun mein Problem: Ich bekomme immer ein File weniger, da eines überschrieben wird (Meldung: Datei existiert bereits...).
Irgendwie krieg ich es nicht hin, die Umbenennung dazu zu bringen, alle Filme durchzunummerieren.

Hier ist mal der code:

@echo off

:Start
for /r c:\Temp\001_REC_IN\ %%i in (*.rec) do call :prozess "%%i"  
goto :eof

:prozess
move /y %1 c:\Temp\002_TEMP\
ren c:\Temp\002_TEMP\"*.rec" = "film.rec"  
start pva.ajb

:: Der Arbeitsprozess von PVA Stumento wird ueberwacht
:loop
tlist | %systemroot%\system32\find /i "cPVAS.exe"  
if errorlevel 1 goto :no
if errorlevel 2 goto :yes

:yes
echo PVA-Strumento arbeiter noch
sleep 5
goto :loop

:no
del c:\Temp\002_TEMP\film.rec
del c:\Temp\003_PVA_OUT\*.txt

:: Fertige Filme nummerieren
set /a counter=1
for %%f in (C:\Temp\003_PVA_out\film_00.pva) do call :count "%%f"  
goto :eof

:count
ren %1 "Titel_%counter%.pva"  
set /a counter+=1
sleep 5
goto :start
:eof

Hat jemand eine Idee?

Schöne Grüße chainsaw

Content-Key: 113827

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

Ausgedruckt am: 28.03.2024 um 09:03 Uhr

Mitglied: 77559
77559 14.04.2009 um 17:48:28 Uhr
Goto Top
Ohne deine Batch jetzt ganz zu durchschauen kommt mir
der "goto :start" unterhalb von :count verkehrt vor.

Welches genaue Windows OS setzt du ein?
Ab W2k ist AFAIK der Label :eof Systemmäßig vorhanden und braucht nicht gesetzt werden.

Grüße
LotPings
Mitglied: bastla
bastla 14.04.2009 um 18:06:35 Uhr
Goto Top
Hallo chainsaw!

Wie LotPings (BTW: Willkommen im Forum!) schon angemerkt hat, brauchst Du weder das Label ":eof" noch das "goto :Start" ...

Ansonsten könntest Du es mit der folgenden (alleridngs ungetesteten) Sicherheitsvariante versuchen:
@echo off & setlocal

for /r c:\Temp\001_REC_IN\ %%i in (*.rec) do call :prozess "%%i"  
goto :eof

:prozess
move %1 c:\Temp\002_TEMP\
ren "c:\Temp\002_TEMP\*.rec" "film.rec"  
start pva.ajb

:: Der Arbeitsprozess von PVA Strumento wird ueberwacht
:loop
tlist | %systemroot%\system32\find /i "cPVAS.exe"  
if errorlevel 1 goto :no

:yes
echo PVA-Strumento arbeitet noch
sleep 5
goto :loop

:no
del c:\Temp\002_TEMP\film.rec
del c:\Temp\003_PVA_OUT\*.txt

:: Fertige Filme nummerieren
set /a counter=1
for %%f in (C:\Temp\003_PVA_out\film_00.pva) do call :count "%%f"  
goto :eof

:count
if exist "Titel_%counter%.pva" set /a counter+=1 & goto :count  
ren %1 "Titel_%counter%.pva"  
sleep 5
goto :eof
Es wird hier immer von 1 beginnend der Wert von %counter% solange erhöht, bis es keine Datei mit der aktuellen Nummer mehr gibt und erst dann umbenannt.

Anmerkung: Das letzte "goto :eof" ist natürlich entbehrlich; falls aber noch ein weiteres Unterprogramm dazu käme, wäre es erforderlich - nicht zuletzt deshalb habe ich es mir angewöhnt, es dennoch anzuschreiben (entspricht auch einem "End-of-Block"-Statement) ...

Grüße
bastla
Mitglied: chainsaw
chainsaw 14.04.2009 um 19:06:03 Uhr
Goto Top
Hallo bastla,

Ich erhalte immer noch das gleiche Ergebnis:
"Dateiname existiert bereits, oder konnte nicht gefunden werden."

Ich bekomme immer zwei Dateien, die erste Datei wird richtig umbenannt in Titel_1.pva
und dann erhalte ich noch eine Datei die film_00.pva heißt, also bei der nichts passiert.
Die restlichen werden wohl alle überschieben.

Hast du noch eine Idee?


@77559

Ich benutze XP Professional

Schöne Grüße
chainsaw
Mitglied: bastla
bastla 14.04.2009 um 19:36:45 Uhr
Goto Top
Hallo chainsaw!

Leider kann ich Dir nicht ganz folgen - es wird ja (in Zeile 27) nur eine Datei ("C:\Temp\003_PVA_out\film_00.pva" - die "for"-Schleife dafür ist eigentlich nicht nötig) gesucht bzw umbenannt. Welche zweite Datei meinst Du?

Grüße
bastla
Mitglied: chainsaw
chainsaw 14.04.2009 um 22:24:55 Uhr
Goto Top
Hallo bastla,

Also: Ich hole von meinem Receiver .REC-Dateien die ich dann mit der Freeware PVA-Strumento
in PVA wandle (PVA= fehlerbereinigte Filmdatei) die ich dann weiterverarbeite.

Die REC-Dateien kopiere ich in den Ordner 001_REC_ In dort liegen dann z.B. 10 Filmdatien im Format .REC
Jetzt hole ich jeweils eine Datei in das Verzeichnis 002_TEMP und benenne dann den Filmnamen in film.rec um. Das ist nötig, weil das Jobticket von PVA-Strumento keine Wildcards verarbeiten kann, sonder immer auf den gleichen Namen losgeht. Deshalb quasi das 002_TEMP als Zwischenverzeichnis.
Dann wird die Software über das Jobticket gestartet (start pva.ajb). PVA Strumento verarbeitet nun die REC-Datei in eine PVA-Datei um und legt dann die fertige Datei in das Verzeichis 003_PVA_out. Die Filmdatei heißt dann film_00.PVA.
Solange PVAStrumento arbeitet wird das mit tlist überprüft. Erst danch soll der Batch die Datei film_00.PVA umbenennen und beginnen die nächste REC-Datei abzuholen.
Deshalb benötige auch eine fortlaufende Nummerierung, da die fertigen Filmdateien immer film_00.PVA heißen und wenn dann der nächste kommt wird der erste überschrieben. Am Ende sollen eben alle 10 Dateien im Verzeichnis 003_PVA_out stehen und durchnummeriert sein z.B. Titel_1.pva, Titel_2.pva usw...

Ist ein wenig verzwickt, ich weiß aber vielleicht hast du ja noch eine Idee
Gruß ANdi
Mitglied: bastla
bastla 14.04.2009 um 22:48:40 Uhr
Goto Top
Hallo chainsaw!

Der letzte Teil (ab Zeile 25) lässt sich noch etwas vereinfachen bzw präzisieren:
:: Fertige Filme nummerieren
set /a counter=1
:count
if exist "C:\Temp\003_PVA_out\Titel_%counter%.pva" set /a counter+=1 & goto :count  
ren C:\Temp\003_PVA_out\film_00.pva "Titel_%counter%.pva"  
sleep 5
goto :eof
Wenn Du das "echo off" in ein "echo on" änderst und (vorübergehend) auf die Zeile 17 verzichtest, kannst Du nach dem Starten des Batches von der Kommandozeile die einzelnen Befehle sehen und so den Ablauf genauer nachvollziehen - noch besser geht das, wenn Du den Batch so startest:
DeinBatch.cmd > C:\Log.txt 2>&1
Dadurch werden alle Ausgaben (inkl Fehlermeldungen) in eine Log-Datei geschrieben und Du kannst herausfinden, an welcher Stelle die Meldung "Dateiname existiert bereits, oder konnte nicht gefunden werden." auftaucht.

Grüße
bastla
Mitglied: chainsaw
chainsaw 15.04.2009 um 00:07:08 Uhr
Goto Top
Hallo bastla,

Sensationell! Jetzt klappt`s - alle Dateien werden sauber nummeriert. Auch wenn ich mit meinem (manchmal gefährlichen) Halbwissen (noch) nicht hundertprozentig verstehe warum. Vielleicht kommt mir im Schlaf die Erleuchtung! face-smile

Herzlichen Dank für deine Hilfe und Gute Nacht!
Gruß Chainsaw
Mitglied: 77559
77559 15.04.2009 um 12:55:52 Uhr
Goto Top
Hallo chainsaw,

schön wenn die Lösung für dich funktioniert. (Dank an bastla für die Begrüßung. Stellt man sich hier irgemdwo vor?)

Ich hatte mich in der Zwischenzeit etwas mit PVAStrumento beschäftigt und denke mir, das der Ansatz der ajb Dateien die über die Gui-Oberfläche erstellt werden, etwas anders ist.
Dort kann man ja auch mehrere Files in eine Jobdatei packen.
Wenn man die Elemente einer ajb Datei als Vorlage auffasst, könnte man per Batch durchaus eine große Jobdatei basteln welche die jeweiligen Quell- und Zieldateien schon enthält und so die Umbenennungs- und Verschiebeoperationen überflüssig macht.
Ich arbeite im Moment noch mit ProjectX und werde mir, wenn ich etwas Zeit habe, eine solche Batch erstellen. Wenn Interesse besteht kann ich sie dann auch hier posten.

Gruß
LotPings
Mitglied: chainsaw
chainsaw 15.04.2009 um 13:51:53 Uhr
Goto Top
Hallo LotPings,

Wie meinst du das genau?

Wenn man die Elemente einer ajb Datei als Vorlage auffasst,
könnte man per Batch durchaus eine große Jobdatei basteln
welche die jeweiligen Quell- und Zieldateien schon enthält

Ich bin immer für bessere Lösungen offen! face-smile

Zwischenzeitlich habe ich mir auch schon wieder was neues überlegt. Die Filme werden ja jetzt dank bastlas Hilfe sauber durchnummeriert und heißen dann halt alle Titel_1.pva, Titel_2.pva. Jetzt dachte ich mir wäre es schön, wenn die fertigen PVA-Dateien wieder den Dateinamen der REC-Datei erhielten. Dabei bin ich jetzt momentan bei folgender Lösung:

Ich lese den Inhalt des 001_REC_in Verzeichnisses in ein Textfile (Liste.txt) ein, nehme dann die erste Zeile als Variable (SET /p var1=<C:\Temp\Liste.txt)
und move dann diese Datei die in als Variable ausgelesen habe in den TEMP-Ordner zum abarbeiten. Wenn die Datei fertig ist, wird sie im PVA-Out Verzeichnis wieder anhand der Variable zurückbenannt:

@echo off & setlocal
:Start
dir /-b /-w C:\Temp\001_REC_in\*.* > C:\Temp\Liste.txt
SET /p var1=<C:\Temp\Liste.txt 
if errorlevel 1 goto :eof
echo %var1%
move C:\Temp\001_REC_in\%var1% C:\Temp\002_TEMP
ren C:\Temp\002_Temp\%var1% film.rec

start /min pva.ajb

:: Der Arbeitsprozess von PVA Strumento wird ueberwacht
:loop
tlist | %systemroot%\system32\find /i "cPVAS.exe"  
if errorlevel 1 goto :no

:yes
echo         PVA-Strumento arbeitet noch
sleep 5
goto :loop

:no
del C:\Temp\002_TEMP\film.rec
del C:\Temp\003_PVA_out\*.txt

:: Fertige Filme wieder zurueckbenennen
ren C:\Temp\003_PVA_out\fertig_00.pva %var1%.pva
sleep 5

goto :Start
:eof

Dabei habe ich noch mit zwei Problemen zu kämpfen: 1. Sobald ein Filmtitel ein Leerzeichen enthält, dann gibts eine Fehlermeldung.
2. Bei der rückbenenneung (gibt`s das Wort überhaupt?) ren C:\Temp\003_PVA_out\fertig_00.pva %var1%.pva heißt dann die Datei z.B. immer
"Crank.rec.pva".
Ich habe nun versucht, die erste Zeile aus der Liste.txt mit
for /f "tokens=* delims==.rec" %%i in (liste.txt) do set var1=%%i auszulesen, aber irgenwas mach ich noch falsch.
Da gibt`s doch sicher eine Möglichkeit, die Leerzeichen zu ignorieren, oder?

Gruß chainsaw
Mitglied: bastla
bastla 15.04.2009 um 14:57:21 Uhr
Goto Top
Hallo chainsaw!

Bei Leerzeichen helfen Anführungszeichen:
ren "C:\Temp\002_Temp\%var1%" film.rec
Wenn Du die letzten 4 Zeichen (.rec) von %var1% nicht benötigst:
ren C:\Temp\003_PVA_out\fertig_00.pva "%var1:~,-4%.pva"
Grüße
bastla

P.S.: Bitte verwende doch zum Posten von Batches die passende ...

P.P.S.: @77559
Stellt man sich hier irgemdwo vor?
Eigentlich genügt's (für mich), "Hallo" zu sagen ...
Mitglied: 77559
77559 15.04.2009 um 16:57:47 Uhr
Goto Top
Zitat von @chainsaw:
Hallo LotPings,

Wie meinst du das genau?

> Wenn man die Elemente einer ajb Datei als Vorlage auffasst,
> könnte man per Batch durchaus eine große Jobdatei
basteln
> welche die jeweiligen Quell- und Zieldateien schon enthält


Ich bin immer für bessere Lösungen offen! face-smile

Nun, eine ajb Datei hat einen Header;
offeryn pvas job v002019 # DO NOT DELETE THIS LINE
Und pro Datei eine Section bestehend aus $Job, $PARMS und dem Abschluß $ENDS
Wie man hier sieht kann ein Film auch aus mehreren Teilen bestehen.
# Job Description
$JOB
# merge multiple inputs
merge "S:\Video\Der Typ, 13 Kinder & ich - SAT 1 2009-04-14 20-15-00.mpg" "S:\Video\Der Typ, 13 Kinder & ich - SAT 1 2009-04-14 20-15-00(01).mpg"
# makeps <infile> <outfile>
makeps ":merged:" "\Der Typ, 13 Kinder & ich - SAT 1 2009-04-14 20-15-00.mpg"

# Job Parameters
$PARMS
# program options
beep 1
loglevel 2
printvstats 1
numberall 1
fixstart 1
sync 1
dropgop 1
dropwronggop 1
ptsjitter 10
relaxpts 0
droplonger 980
strongaudio 1
TSfallback 1
relaxedts 0
dropscrambledts 0
IsTS192 0
setbr 1
setvbr 1
setavg 1
clearcdf 1
drope4 0
no_m2check 0
patchARinMPEGHeader 0
adjusttc 1
packsize 0
splitvideoFMT 1
usevdrmarks 0
splitsize 0
overlap 1
spliteven 0
splitaudioFMT 1
splitontrack 1
audiooffsetacc 1
mp2beautify 0
mp2strictlen 1
vdrac3hack 1
writeac3sheader 1
goppts 1
writeidd 0
writeinfo 0
save4join 0
filenamedelay 1
delfileifnoerr 0
$ENDS # end section

Da der $PARMS Abschnitt ja innerhalb der bearbeiteten Filme gleich bleibt, kann man den in eine separate Datei kopieren und jeweils an die Job Datei anhängen (ggfs gar nicht nötig, ich meine gelesen zu gaben er nimmt die zuletzt benutzten.)

Also Header schreiben, per for schleife die Eingangsdateien als $JOB Abschnitt anhängen, $PARMS dran und nächste.
Zuletzt einmal cPVAs mit dem MonsterJob anschmeissen (per Start /Wait - dann entfällt das pollen) und gut ist.

Ich komme im Moment immer nur zwischendurch zum Lesen, dauert also noc etwas mit dem fertigen Batch face-wink

Gruß
LotPings
Mitglied: chainsaw
chainsaw 15.04.2009 um 22:25:51 Uhr
Goto Top
Hallo bastla,

ren "C:\Temp\002_Temp\%var1%" film.rec  

funktioniert - den Move-Befehlt musste ich auch in Anführung setzten. Ich habe immer nur die Variable in Anführung gesetzt ("%var1%") nicht den ganzen Pfad.
Deshalb gings nicht. Der Teufel steckt halt im Detail...

ren C:\Temp\003_PVA_out\fertig_00.pva "%var1:~,-4%.pva"   
Wie zu erwarten - genial! Danke jetzt läuft alles wie am Schnürchen.

Das mit den Formatierungen habe ich schon lange gesucht.

Dank und Gruß
chainsaw
Mitglied: chainsaw
chainsaw 15.04.2009 um 22:40:32 Uhr
Goto Top
Hallo LotPings

Jetzt habe ich verstanden wie du die Sache angehen willst. Es führen eben viel Wege nach Rom.
Ich bin da schon angekommen, dank der Hilfe hier im Forum. face-smile

Lass was hören, wenn du deine Lösung fertig hast.

Noch ne Anmerkung: In meinem Header steht exakt das gleiche wie in deinem - sieht so aus als könntest du den einfach für jeden Job übernehmen ohne neu schreiben zu müssen.
Also Header schreiben, per for schleife die Eingangsdateien als $JOB...

Die Merge Funktion nütze ich eigentlich so gut wie nie. Ich werde das ganze jetzt noch in einer demux-Variante anlegen und dann bin ich glücklich! face-smile

Gruß chainsaw
Mitglied: bastla
bastla 15.04.2009 um 22:46:50 Uhr
Goto Top
Hallo chainsaw!
Wie zu erwarten - genial!
Aber nicht doch - nur was man(n) hier im Forum so lernt (ich sag nur "Biber" und seine Tutorials und Kommentare).

Freut mich jedenfalls, dass Du ein erstes brauchbares Ergebnis hast. face-smile Wie's aussieht ist da ja noch more to come ...

Grüße
bastla