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:
Hat jemand eine Idee?
Schöne Grüße chainsaw
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
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 113827
Url: https://administrator.de/contentid/113827
Ausgedruckt am: 26.11.2024 um 04:11 Uhr
14 Kommentare
Neuester Kommentar
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
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
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:
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
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
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
Hallo chainsaw!
Der letzte Teil (ab Zeile 25) lässt sich noch etwas vereinfachen bzw präzisieren:
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:
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
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
DeinBatch.cmd > C:\Log.txt 2>&1
Grüße
bastla
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
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
Hallo chainsaw!
Bei Leerzeichen helfen Anführungszeichen:
Wenn Du die letzten 4 Zeichen (.rec) von %var1% nicht benötigst:
Grüße
bastla
P.S.: Bitte verwende doch zum Posten von Batches die passende ...
P.P.S.: @77559
Bei Leerzeichen helfen Anführungszeichen:
ren "C:\Temp\002_Temp\%var1%" film.rec
ren C:\Temp\003_PVA_out\fertig_00.pva "%var1:~,-4%.pva"
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 ...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!
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!
Nun, eine ajb Datei hat einen Header;
offeryn pvas job v002019 # DO NOT DELETE THIS LINE
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
Gruß
LotPings
Hallo chainsaw!
Freut mich jedenfalls, dass Du ein erstes brauchbares Ergebnis hast. Wie's aussieht ist da ja noch more to come ...
Grüße
bastla
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. Wie's aussieht ist da ja noch more to come ...
Grüße
bastla