konrad123
Goto Top

Zeichenkette in Dateinamen erkennen.

Ich bräuchte Hilfe bei der Erstellung eines Scripts bzw. ich finde den Fehler nicht.

Hallo,

ich habe mich an einigen Scripts versucht und komme nicht weiter.
Ich möchte aus einem Ordner und Unterordner Filmaufnahmen automatisch von dem Programm Comskip scannen lasse.
Dazu habe ich ein Script das mir nachschaut welche Dateien schon gescannt wurden.
for /F %%i in ('Dir F:\aufnahmen\card1\*.ts /b /s /a-d') do if not exist "%%~dpni.txt" "D:\comskip\sender.bat" "%%~fi"
Bei dem Sript wurde mir schon im Forum geholfen und das funktioniert wunderbar.

Nachdem das obere Script herausgefunden hat welche Dateien gescannt wurden, würde ich gerne schauen wie die Dateien gescannt werden sollen.
Dazu habe ich versucht dieses Script zu erstellen. Doch es funktioniert leider nicht und mir ist nicht so ganz klar warum.
sender.bat:

echo off
echo "%1"|find "RTL">NUL
if "%errorlevel%" equ "0" (
"i:\comskip\comskip.exe" --ini=i:\comskip\ChannelIni\RTL.ini --logo=i:\comskip\ChannelLogos\RTL.logo.txt %1
) else (
echo %1|find "Sat.1">NUL
if "%errorlevel%" equ "0" (
"i:\comskip\comskip.exe" --ini=i:\comskip\ChannelIni\sat1.ini --logo=i:\comskip\ChannelLogos\sat1.logo.txt %1
) else (
echo %1|find "RTL2">NUL
If "%errorlevel%" equ "0" (
"i:\comskip\comskip.exe" --ini=i:\comskip\ChannelIni\RTL2.ini --logo=i:\comskip\ChannelLogos\RTL2.logo.txt %1
) else (
echo %1|find "ZDF">NUL
if "%errorlevel%" equ "0" (
"i:\comskip\comskip.exe" --ini=i:\comskip\ChannelIni\ZDF.ini --logo=i:\comskip\ChannelLogos\ZDF.logo.txt %1
) else (
echo %1|find "Kabel">NUL
if "%errorlevel%" equ "0" (
"i:\comskip\comskip.exe" --ini=i:\comskip\ChannelIni\Kabel.ini --logo=i:\comskip\ChannelLogos\Kabel.logo.txt %1
) else (
echo %1|find "ProSieben">NUL
if "%errorlevel%" equ "0" (
"i:\comskip\comskip.exe" --ini=i:\comskip\ChannelIni\pro7.ini --logo=i:\comskip\ChannelLogos\pro7.logo.txt %1
) else (
echo %1|find "DMAX">NUL
If "%errorlevel%" equ "0" (
"i:\comskip\comskip.exe" --ini=i:\comskip\ChannelIni\DMAX.ini --logo=i:\comskip\ChannelLogos\DMAX.logo.txt %1
) else (
echo %1|find "VOX">NUL
if "%errorlevel%" equ "0" (
"i:\comskip\comskip.exe" --ini=i:\comskip\ChannelIni\VOX.ini --logo=i:\comskip\ChannelLogos\VOX.logo.txt %1
) else (
echo %1|find "Erste">NUL
if "%errorlevel%" equ "0" (
"i:\comskip\comskip.exe" --ini=i:\comskip\ChannelIni\ard.ini --logo=i:\comskip\ChannelLogos\ard.logo.txt %1
) else (
"i:\comskip\comskip.exe" --ini=i:\comskip\comskip.ini
)

Leider hab ich keine Ahnung von Batch schreiben und finde einfach nicht den Denkfehler. Es ist als ob find nichts findet. Ich weiß wirklich nicht mehr weiter.
Für Hilfe wäre ich sehr dankbar.

Gruß Konrad

Content-Key: 118216

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

Printed on: April 19, 2024 at 14:04 o'clock

Mitglied: 60730
60730 Jun 15, 2009 at 18:17:07 (UTC)
Goto Top
Servus,

so - wie ich dein Script sehe - ist es - kann es nicht laufen.

echo "%1"|find "RTL">NUL
bedeutet auf Biberdeutsch:
schreibe den Aufruf der batch nach Nul.

Und wie es die Bürger der neueren Bundesländern sagen würden.
Na schräib moll den äufrüf von där bädsch nach null nischdd..


..und egal wie -in null wird nix gefunden - da null "null" ausgabe hat..

ergo "müßte" es so funktionieren
echo "%1"|find "RTL" && "i:\comskip\comskip.exe" --ini=i:\comskip\ChannelIni\RTL.ini --logo=i:\comskip\ChannelLogos\RTL.logo.txt %1  


und "wenn" der zu findende Wert eh der gleiche ist, wie der Name der .ini und der .txt - am einfachsten das ganze auch noch "vollparametrisieren -, anstatt ein ellenlanges - bis auf die Variablen identisches Script zu schreiben.


gruß
Mitglied: 77559
77559 Jun 15, 2009 at 18:25:16 (UTC)
Goto Top
Da es auf den Errorlevel ankommt sehe ich anders als Timo in deiner Verwendung von echo und find kein Problem.

Ein Problem ist aber :
  • das Fehlen von etlichen schließenden Klammern am Ende. Klammern müssen immer paarweise benutzt werden, deinen "Else (" fehlt aber das zugehörige ")"
  • die Suche nach RTL vor der Suche nach RTL2 - der längere Begriff muss zuerst kommen.
  • für meinen Geschmack die schreckliche Redundanz face-wink

Gruß
LotPings
Member: Biber
Biber Jun 15, 2009 at 19:37:19 (UTC)
Goto Top
Moin Konrad123,

also könnte es - im ersten Schritt soweit entschlackt, dass die grundsätzliche Programmlogik erkennbar wird- so skizziert werden:

@echo off & setlocal

echo %1|find /i "Sat.1">NUL &&  call :processComskip "sat1" "sat1" %1 && goto :eof  
echo %1|find /i "Kabel">NUL &&  call :processComskip "Kabel" "Kabel" %1  && goto :eof  
echo %1|find /i "ProSieben">NUL &&  call :processComskip "pro7" "pro7" %1 && goto :eof  

.....
:: nix gefunden?
goto Fehlerbehandlung

:processComskip para1=Ininame para2=logoname para3=der alte Para%1 des Batches
"i:\comskip\comskip.exe" --ini=i:\comskip\ChannelIni\%~1.ini --logo=i:\comskip\ChannelLogos\%~2.logo.txt %3  
goto :eof

[als grobe Skizze]

Grüße
Biber

[/Edit] ein :call :processComskip+goto :eof statt ein goto : ProcessComskip [/Edit]
Member: konrad123
konrad123 Jun 16, 2009 at 06:36:56 (UTC)
Goto Top
Danke für eure Antworten.
Ich hab das Script zum laufen gebracht. Es ist noch nicht schön aufgebaut aber es läuft erstmals.
Ich hab jetzt allerdings noch ein Problem. Comskip sagt es findet die Datei nicht.
Es liegt an den fehlenden "" um den Pfad. Doch ich weiß nicht wie ich es hinbekomme das da der Pfad in "" gesetzt wird.

Gruß Konrad
Member: konrad123
konrad123 Jun 16, 2009 at 14:22:41 (UTC)
Goto Top
Kennt sich da keiner aus?
Der Pfad wird nur bis zum ersten Leerzeichen als Pfad angesehen. Die Teile nach dem Pfad interpretiert Comskip als Parameter. Ich habs schon mit ( jetzt bitte nicht hauen face-smile ) zwei "" versucht also den Parameter ""%1"" ausgegeben. Doch es funktioniert leider nicht.
Danke für eure Hilfe.
Mitglied: 77559
77559 Jun 16, 2009 at 14:29:44 (UTC)
Goto Top
Natürlich kennen sich hier einige aus,

aber du solltest dir angewöhnen präzise Fragen zu stellen.

Wenn du schreibst
Ich hab das Script zum laufen gebracht
Dann weiß hier keiner WAS du gemacht hast.

Grundsätzlich solltest du auch mal Beispiel Dateinamen posten, ich könnte mir nämlich vorstellen das es viel effizienter wäre den Sender direkt zu extrahieren.
In den bisherigen Beispielen kommt der Dateiname in %1 an, ob da bereits Anführungszeichen bestehen weiß auch niemand.

Gruß
LotPings
Mitglied: 60730
60730 Jun 16, 2009 at 14:30:16 (UTC)
Goto Top
Zitat von @konrad123:
Kennt sich da keiner aus?

Servus,

nein - offensichtlich niemand....

Zur Info:

ein
Echo off
gehört erst dann in eine Batch, wenn Sie 100% wasserdicht ist und ohne diese Zeile ist Bugfixen auch kein Ding.

Danke für eure Hilfe.

gerne geschehen - und wenn du uns nun dein Sammelsurium unserer Ansätze zeigst, könnte man auch genau an der Stelle weitermachen, wo der Schuh drückt.

gruß
Member: konrad123
konrad123 Jun 16, 2009 at 16:35:12 (UTC)
Goto Top
Hallo, sorry war mein Fehler ich hätte mich besser Ausdrücken sollen.
Ich hab jetzt das Script nochmals nach Bibers Vorgaben neu aufgebaut und siehe da der Fehler ist weg.
Es funktioniert ohne Probleme und die Dateien werden bearbeitet.
Für den Fall das es noch jemanden interessiert so ist das ganze jetzt aufgebaut.

In meinen Video-Ordner liegen .ts Dateien in Unterordner. z.B.

Two and a Half Men_2009-06-08_16-10.ts
Scrubs - Die Anfänger Mein falscher Rückschluss_ProSieben_2009-06-03_09-50.ts
Die Simpsons Jazzy and the Pussycats_ProSieben_2009-06-07_18-40.ts

Das erste Script sucht nach .ts Dateien und den dazugehörigen .txt Dateien. Falls keine .txt Dateien gefunden werden übergibt das Script "comskipnachts.bat" die Dateinamen an die "sender.bat"

comskipnachts.bat:
for /R "E:\" %%i in (*.ts) do if not exist "%%~dpni.txt" "i:\comskip\sender.bat" "%%~fi"

sender.bat:
@echo off & setlocal
echo sender.bat berechnete %1 >>sender.log

echo %1|find /i "Sat.1">NUL && call :processComskip "sat1" "sat1" %1 && goto :eof
echo %1|find /i "Kabel">NUL && call :processComskip "kabel" "kabel" %1 && goto :eof
echo %1|find /i "ProSieben">NUL && call :processComskip "pro7" "pro7" %1 && goto :eof
echo %1|find /i "RTL">NUL && call :processComskip "rtl" "rtl" %1 && goto :eof
echo %1|find /i "RTL2">NUL && call :processComskip "rtl2" "rtl2" %1 && goto :eof
echo %1|find /i "VOX">NUL && call :processComskip "VOX" "VOX" %1 && goto :eof
echo %1|find /i "ZDF">NUL && call :processComskip "zdf" "zdf" %1 && goto :eof
echo %1|find /i "DMAX">NUL && call :processComskip "dmax" "dmax" %1 && goto :eof
echo %1|find /i "ERSTE">NUL && call :processComskip "ard" "ard" %1 && goto :eof

::nix gefunden?
goto standart

:processComskip para1=Ininame para2=logoname para3=der alte Para%1 des Batches
"i:\comskip\comskip.exe" --ini=i:\comskip\ChannelIni\%~1.ini --logo=i:\comskip\ChannelLogos\%~2.logo.txt %3


:standart
"i:\comskip\comskip.exe" %1


goto :eof

Es scheint wunderbar zu funktionieren. Ich muß das noch eine Weile testen.

Danke für eure Hilfe.
Mitglied: 77559
77559 Jun 16, 2009 at 16:50:12 (UTC)
Goto Top
Ich nehme mal an das der erste Dateiname ohne Sender ein Versehen ist.

So ein Dateiname lässt sich doch wunderbar mit delims=_ parsen.
Und wenn du deine ini und logo Dateien an die tatsächlichen Sendernamen anpasst, geht das ganze viel einfacher.

Übrigends wrst du mit deiner Batchdatei niemals RTL2 Filme säubern können, weil in RTL2 mmer auch RTL enthalten ist und die Zeile mit RTL2 gar nicht abgearbeitet wrid.

Gruß
LotPings
Member: Biber
Biber Jun 16, 2009 at 17:38:43 (UTC)
Goto Top
Moin Lord,
<OT>
Zitat von @77559:
Übrigends wrst du mit deiner Batchdatei niemals RTL2 Filme säubern können, weil ....

ich denke, diese ganzen Schmuddelsender werden auch durch alle Batchdateien dieser Welt nicht appetitlicher.
Und bei 9Live beispielsweise helfen wahrscheinlich auch keine mit Sagrotan 2.0 kompilierte Skripte

Andererseits....

Vielleicht ist es gar nicht so schlecht, wenn ein nicht unerheblicher Teil der bundesdeutschen Durchschnitts-MitbürgerInnen sich die Zeit damit vertreibt, statt sich dauernd von gutmütigen Moderatoren auf den Kompost tragen zu lassen.

</OT>

@konrad123
Freut mich, wenn es jetzt läuft.
Und natürlich hat Lowpings Recht mit "So ein Dateiname lässt sich doch wunderbar mit delims=_ parsen" etc pp..

Aber ich würde (gerade wenn Dir die Routine beim Skripten. fehlt) besser mit dem "kürzer und kompakter machen" noch warten.

Denn so wie jetzt ist der Batch zwar nicht so voller überraschender Wendungen, aber durchaus lesbar und von Dir pflegbar.

Was eventuell noch entfallen könnte sind die (als unterschiedliche Paramter vorgesehenen) Ini-Namen und Logo-Namen.
Wenn so ein Plattsender nach Deinen Konventionen dann halt eine Ini-Datei namens "Sat1.ini" und eine Logo-Datei "Sat1.logo.txt" haben soll... okay, dann brauchst Du diesen immer gleichen Text "Sat1" natürlich nur einmal übergeben.

Grüße
Biber
Member: konrad123
konrad123 Jun 17, 2009 at 07:09:11 (UTC)
Goto Top
Das mit dem verkürzen des scripts lass ich mal. Doch ich bin froh das das jetztige Script funktioniert. Ich denke das ich da auch noch in einem halben Jahr schnell einen Sender dazu fügen kann und das ist für mich wichtig. Außerdem versteh ich den oberen Teil ganz gut. Bei den unteren versteh ich noch nicht alles:

:processComskip para1=Ininame para2=logoname para3=der alte Para%1 des Batches
"i:\comskip\comskip.exe" --ini=i:\comskip\ChannelIni\%~1.ini --logo=i:\comskip\ChannelLogos\%~2.logo.txt %3

Wann wurden die Variablen %3 oder %~2 erstellt. Liegt das an para1= usw. ?
Dann müsste ich doch eigentlich mit der Zeile:
echo sender.bat berechnete %1 von Sender %2 (bzw. %~2) >>sender.log
den Sender mit an die Log datei übergeben? Dem ist aber nicht so. Zumindest rührt er sich nicht.

Das mit RTL und RTL2 hab ich schon korrigiert. Auch wenn ich glaub ich noch nie was von RTL2 aufgenommen habe.
Wenn die inis erstmal funktionieren und die Werbung automatisch entfernt wird dann kann man vielleicht mal einen Film davon aufnehmen. Ich habs einfach nicht mehr ausgehalten das ich zwei Stunden klotzen muß um einen Film der auf 1Stunde verstümmelt worde ist zu schauen.
Ich dank euch auf jedenfall für eure Hilfe.

Gruß Konrad
Mitglied: 77559
77559 Jun 17, 2009 at 08:24:47 (UTC)
Goto Top
Zitat von @konrad123:
Bei den unteren versteh ich noch nicht alles:

:processComskip para1=Ininame para2=logoname para3=der alte Para%1 des Batches
"i:\comskip\comskip.exe" --ini=i:\comskip\ChannelIni\%~1.ini --logo=i:\comskip\ChannelLogos\%~2.logo.txt %3
Wann wurden die Variablen %3 oder %~2 erstellt. Liegt das an para1= usw. ?

Die Angaben hinter einem :Label sind rein Informativ und haben auf die Ausführung keinen Einfluß. (Die Kommentare mit Pseudo Labels :: :; etc nutzen diesen Umstand aus.)

Die einem Call angehängten Daten werden wie auf der Kommandozeile übergebene Parameter behandelt, Leerzeichen Tab Komma Semikolon trennen die Elemente (Es sei denn sie werden in Anführungszecihen eingefasst) Die Originalzeile erhält man mit %* die einzelnen Elemente mit %x wobei x 1 bis 9 sein kann. Weitere Elemente erhält man durch "nachschieben" mit Hilfe von shift.

Such mal in der Hillfe nach call cmd for set oder gib auf der Kommandozeile ein
Help
bzw
Help call etc

Gruß
LotPings