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

Fortlaufend umbenennen - Frage dazu

Frage Entwicklung Batch & Shell

Mitglied: chainsaw

chainsaw (Level 1) - Jetzt verbinden

14.04.2009, aktualisiert 15.04.2009, 5520 Aufrufe, 14 Kommentare

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:

01.
@echo off 
02.
 
03.
:Start 
04.
for /r c:\Temp\001_REC_IN\ %%i in (*.rec) do call :prozess "%%i" 
05.
goto :eof 
06.
 
07.
:prozess 
08.
move /y %1 c:\Temp\002_TEMP\ 
09.
ren c:\Temp\002_TEMP\"*.rec" = "film.rec" 
10.
start pva.ajb 
11.
 
12.
:: Der Arbeitsprozess von PVA Stumento wird ueberwacht 
13.
:loop 
14.
tlist | %systemroot%\system32\find /i "cPVAS.exe" 
15.
if errorlevel 1 goto :no 
16.
if errorlevel 2 goto :yes 
17.
 
18.
:yes 
19.
echo PVA-Strumento arbeiter noch 
20.
sleep 5 
21.
goto :loop 
22.
 
23.
:no 
24.
del c:\Temp\002_TEMP\film.rec 
25.
del c:\Temp\003_PVA_OUT\*.txt 
26.
 
27.
:: Fertige Filme nummerieren 
28.
set /a counter=1 
29.
for %%f in (C:\Temp\003_PVA_out\film_00.pva) do call :count "%%f" 
30.
goto :eof 
31.
 
32.
:count 
33.
ren %1 "Titel_%counter%.pva" 
34.
set /a counter+=1 
35.
sleep 5 
36.
goto :start 
37.
:eof
Hat jemand eine Idee?

Schöne Grüße chainsaw
Mitglied: LotPings
14.04.2009 um 17:48 Uhr
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
Bitte warten ..
Mitglied: bastla
14.04.2009 um 18:06 Uhr
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:
01.
@echo off & setlocal 
02.
 
03.
for /r c:\Temp\001_REC_IN\ %%i in (*.rec) do call :prozess "%%i" 
04.
goto :eof 
05.
 
06.
:prozess 
07.
move %1 c:\Temp\002_TEMP\ 
08.
ren "c:\Temp\002_TEMP\*.rec" "film.rec" 
09.
start pva.ajb 
10.
 
11.
:: Der Arbeitsprozess von PVA Strumento wird ueberwacht 
12.
:loop 
13.
tlist | %systemroot%\system32\find /i "cPVAS.exe" 
14.
if errorlevel 1 goto :no 
15.
 
16.
:yes 
17.
echo PVA-Strumento arbeitet noch 
18.
sleep 5 
19.
goto :loop 
20.
 
21.
:no 
22.
del c:\Temp\002_TEMP\film.rec 
23.
del c:\Temp\003_PVA_OUT\*.txt 
24.
 
25.
:: Fertige Filme nummerieren 
26.
set /a counter=1 
27.
for %%f in (C:\Temp\003_PVA_out\film_00.pva) do call :count "%%f" 
28.
goto :eof 
29.
 
30.
:count 
31.
if exist "Titel_%counter%.pva" set /a counter+=1 & goto :count 
32.
ren %1 "Titel_%counter%.pva" 
33.
sleep 5 
34.
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
Bitte warten ..
Mitglied: chainsaw
14.04.2009 um 19:06 Uhr
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?


@LotPings

Ich benutze XP Professional

Schöne Grüße
chainsaw
Bitte warten ..
Mitglied: bastla
14.04.2009 um 19:36 Uhr
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
Bitte warten ..
Mitglied: chainsaw
14.04.2009 um 22:24 Uhr
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
Bitte warten ..
Mitglied: bastla
14.04.2009 um 22:48 Uhr
Hallo chainsaw!

Der letzte Teil (ab Zeile 25) lässt sich noch etwas vereinfachen bzw präzisieren:
01.
:: Fertige Filme nummerieren 
02.
set /a counter=1 
03.
:count 
04.
if exist "C:\Temp\003_PVA_out\Titel_%counter%.pva" set /a counter+=1 & goto :count 
05.
ren C:\Temp\003_PVA_out\film_00.pva "Titel_%counter%.pva" 
06.
sleep 5 
07.
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
Bitte warten ..
Mitglied: chainsaw
15.04.2009 um 00:07 Uhr
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!

Herzlichen Dank für deine Hilfe und Gute Nacht!
Gruß Chainsaw
Bitte warten ..
Mitglied: LotPings
15.04.2009 um 12:55 Uhr
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
Bitte warten ..
Mitglied: chainsaw
15.04.2009 um 13:51 Uhr
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!

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:

01.
@echo off & setlocal 
02.
:Start 
03.
dir /-b /-w C:\Temp\001_REC_in\*.* > C:\Temp\Liste.txt 
04.
SET /p var1=<C:\Temp\Liste.txt  
05.
if errorlevel 1 goto :eof 
06.
echo %var1% 
07.
move C:\Temp\001_REC_in\%var1% C:\Temp\002_TEMP 
08.
ren C:\Temp\002_Temp\%var1% film.rec 
09.
 
10.
start /min pva.ajb 
11.
 
12.
:: Der Arbeitsprozess von PVA Strumento wird ueberwacht 
13.
:loop 
14.
tlist | %systemroot%\system32\find /i "cPVAS.exe" 
15.
if errorlevel 1 goto :no 
16.
 
17.
:yes 
18.
echo         PVA-Strumento arbeitet noch 
19.
sleep 5 
20.
goto :loop 
21.
 
22.
:no 
23.
del C:\Temp\002_TEMP\film.rec 
24.
del C:\Temp\003_PVA_out\*.txt 
25.
 
26.
:: Fertige Filme wieder zurueckbenennen 
27.
ren C:\Temp\003_PVA_out\fertig_00.pva %var1%.pva 
28.
sleep 5 
29.
 
30.
goto :Start 
31.
: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
Bitte warten ..
Mitglied: bastla
15.04.2009 um 14:57 Uhr
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 Formatierung ...

P.P.S.: @LotPings
Stellt man sich hier irgemdwo vor?
Eigentlich genügt's (für mich), "Hallo" zu sagen ...
Bitte warten ..
Mitglied: LotPings
15.04.2009 um 16:57 Uhr
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!

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

Gruß
LotPings
Bitte warten ..
Mitglied: chainsaw
15.04.2009 um 22:25 Uhr
Hallo bastla,

01.
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...

01.
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
Bitte warten ..
Mitglied: chainsaw
15.04.2009 um 22:40 Uhr
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.

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!

Gruß chainsaw
Bitte warten ..
Mitglied: bastla
15.04.2009 um 22:46 Uhr
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. Wie's aussieht ist da ja noch more to come ...

Grüße
bastla
Bitte warten ..
Neuester Wissensbeitrag
Humor (lol)

Linkliste für Adventskalender

(3)

Information von nikoatit zum Thema Humor (lol) ...

Ähnliche Inhalte
LAN, WAN, Wireless
gelöst HP Switches - Frage zu Spanning Tree bzw. Loop Back Protection (12)

Frage von chfran zum Thema LAN, WAN, Wireless ...

Hyper-V
Grundsatz Frage Anbindung Hyper V Hosts ans Netzwerk (7)

Frage von Eifeladmin zum Thema Hyper-V ...

Windows Netzwerk
gelöst Frage zu den Netzwerkfreigaben mit Bild (8)

Frage von M.Marz zum Thema Windows Netzwerk ...

Router & Routing
gelöst PfSense, Routing-Frage (10)

Frage von mrserious73 zum Thema Router & Routing ...

Heiß diskutierte Inhalte
Windows Server
DHCP Server switchen (25)

Frage von M.Marz zum Thema Windows Server ...

SAN, NAS, DAS
gelöst HP-Proliant Microserver Betriebssystem (14)

Frage von Yannosch zum Thema SAN, NAS, DAS ...

Grafikkarten & Monitore
Win 10 Grafikkarte Crash von Software? (13)

Frage von Marabunta zum Thema Grafikkarten & Monitore ...

Windows 7
Verteillösung für IT-Raum benötigt (12)

Frage von TheM-Man zum Thema Windows 7 ...