2017-12-17 2 views
-2

ich Videos Dateien mit Dateinamen haben:automatisch Untertitel-Datei mit Skript Videodatei Batch umbenennen

Series.Name.S01E01.andalotofstuff.mkv 
Series.Name.S01E02.andalotofstuff.mkv 
Series.Name.S02E01.andalotofstuff.mkv 
etc. 

wo andalotofstuff in jeder Datei nicht notwendigerweise die gleiche ist, und kann ., - und [] umfassen.

Ich habe auch Untertitel-Dateien mit Dateinamen:

Series Name 1x01 - Episode Name andotherstuff.srt 
Series Name 1x02 - Episode Name andotherstuff.srt 
Series Name 2x01 - Episode Name andotherstuff.srt 
etc. 

wo andotherstuff nicht unbedingt die gleichen in jeder Datei ist, und () enthalten kann.

Was ich will, ist srt Dateien mit den entsprechenden mkv Dateinamen mit einem Batch-Skript, wenn möglich, und ich habe keine Ahnung, wie.

Einige konkrete Beispiele sind:

Marvels.Agents.of.S.H.I.E.L.D.S05E04.720p.HDTV.x264-AVS[eztv].mkv 
Marvel's Agents of S.H.I.E.L.D. 5x04 - A Life Earned (Español (Latinoamérica)).srt 

The.Shannara.Chronicles.S02E08.720p.HDTV.x264-AVS[eztv].mkv 
The Shannara Chronicles 2x08 - Amberle (Español (España)).srt 

The.Shannara.Chronicles.S02E10.720p.HDTV.x264-KILLERS[eztv].mkv 
The Shannara Chronicles 2x10 - Blood (English).srt 

Beachten Sie, dass nicht unbedingt alle Videodateien eine entsprechende Untertiteldatei besitzt.

Here ich etwas gefunden, das angeblich auf Linux arbeiten ...

Antwort

0

Hier ist eine kommentierte Batch-Datei für diese Aufgabe:

@echo off 

rem Setup a local environment for this batch file creating lots 
rem of environment variables which should not exist anymore after 
rem finishing batch file execution. 

setlocal EnableExtensions DisableDelayedExpansion 

rem Get all *.mkv and *.srt file names in current directory without path 
rem and without file extension loaded into memory assigned to environment 
rem variables with name mkv_1, mkv_2, ..., srt_1, srt_2, ... using the 
rem two subroutines GetFileList and AddFileToList. 

call :GetFileList mkv 
call :GetFileList srt 
goto ValidateFileCounts 

rem Subroutine GetFileList runs command FOR which executes command DIR in 
rem a separate command process in background which outputs all file names 
rem with the file extension passed to the subroutine as first parameter 
rem sorted by name. Each file name output by DIR is assigned to an environment 
rem variable with passed file extension, an underscore and an incremented 
rem number as variable name. The number of files with given file extension 
rem is assigned to an environment variable with name FileCount_Extension. 

:GetFileList 
set "FileNumber=0" 
set "FileExtension=%1" 
for /F "delims=" %%I in ('dir *.%FileExtension% /A-D /B /ON 2^>nul') do call :AddFileToList "%%~nI" 
set "FileCount_%FileExtension%=%FileNumber%" 
goto :EOF 

rem Subroutine AddFileToList increments current file number by one and then 
rem assigns the file name without file extension and without path passed 
rem from calling subroutine GetFileList as first and only parameter to 
rem an environment variable with automatically generated varible name. 

:AddFileToList 
set /A FileNumber+=1 
set "%FileExtension%_%FileNumber%=%~1" 
goto :EOF 

rem After creating the two file lists in memory it is validated that the 
rem file rename operation can be started at all. There must be *.srt files 
rem found in current directory and the number of *.mkv files must be equal 
rem the number of *.srt files. 

:ValidateFileCounts 
if %FileCount_srt% == 0 (
    echo/ 
    echo There are no *.srt files in directory: 
    echo/ 
    echo %CD% 
    echo/ 
    pause 
    goto EndBatch 
) 

if not %FileCount_mkv% == %FileCount_srt% (
    echo/ 
    echo Number of *.mkv files is not equal number of *.srt files in directory: 
    echo/ 
    echo %CD% 
    echo/ 
    pause 
    goto EndBatch 
) 

rem Now delayed environment variable expansion is needed for the file rename 
rem operation in a loop which could not be enabled at beginning of the batch 
rem file in case of any file name contains one or more exclamation marks. 

rem *.srt files having already the same file name as corresponding *.mkv 
rem file detected by identical current and new file name are ignored for 
rem the rename operation. 

rem It is also not possible to rename a *.srt file to name of a *.srt which 
rem already exists. In this case an error message is output for the *.srt 
rem file which cannot be renamed and finally PAUSE is executed to give the 
rem batch file user the possibility to read all those file rename errors. 
rem But it is very unlikely that this error message is displayed ever. 

setlocal EnableDelayedExpansion 
set "RenameError=" 
for /L %%I in (1,1,%FileCount_srt%) do (
    set "FileNameNew=!mkv_%%I!.srt" 
    set "FileNameNow=!srt_%%I!.srt" 
    if not "!FileNameNew!" == "!FileNameNow!" (
     if not exist "!FileNameNew!" (
      ren "!FileNameNow!" "!FileNameNew!" 
     ) else (
      echo Rename file !FileNameNow! 
      echo to new name !FileNameNew! 
      echo not possible as such a file exists already. 
      echo/ 
      set "RenameError=1" 
     ) 
    ) 
) 
if defined RenameError pause 
endlocal 

rem The previous environment is restored finally which means all environment 
rem variables created by this batch file are removed from memory. There is 
rem neither a message output nor batch file processing halted if no error 
rem occurred during entire process. 

:EndBatch 
endlocal 

Es gibt keinen wirklichen Namen Datei Algorithmus passend wie früher sieht aus wie der Algorithmus ist menschliche Sprache Intelligenz. Die Batch-Datei lädt also einfach die Liste der * .mkv-Dateinamen sortiert nach Name und die Liste der * .srt-Dateinamen ebenfalls nach Namen sortiert und benennt dann zuerst die * .srt-Datei in den Namen der ersten * .mkv-Datei um * .srt-Datei zum Namen der zweiten * .mkv-Datei und so weiter. Diese einfache Lösung funktionierte für die gegebenen Beispiele.

Es ist möglich, den Befehl echo links einzufügen ren zu befehlen und Befehl pause am Ende der Batch-Datei anhängen oder es aus einem Fenster der Eingabeaufforderung ausführen, um alle die Datei, um zu sehen Operationen zu umbenennen, ohne sie wirklich für die Überprüfung durch den Benutzer zu tun bevor Sie die * .srt-Dateien wirklich umbenennen.

Um die verwendeten Befehle und ihre Funktionsweise zu verstehen, öffnen Sie ein Eingabeaufforderungsfenster, führen Sie die folgenden Befehle aus und lesen Sie alle Hilfeseiten, die für jeden Befehl angezeigt werden, sorgfältig durch.

  • call /?
  • dir /?
  • echo /?
  • endlocal /?
  • for /?
  • goto /?
  • if /?
  • pause /?
  • rem /?
  • ren /?
  • setlocal /?

Lesen Sie auch die Microsoft Artikel über Using Command Redirection Operators für eine Erklärung der 2>nul. Der Umleitungsoperator > muss mit Caretzeichen ^ auf FüR Befehlszeilen entwertet wird als literale Zeichen interpretiert werden, wenn Windows-Befehlsinterpreter verarbeitet diese Befehlszeile vor dem Befehl FOR Ausführung, die die eingebetteten dir Befehlszeile in einem separaten Befehlsprozess ausführt, gestartet im Hintergrund.

lesen this answer für Details über die Befehle SETLOCAL und ENDLOCAL und Where does GOTO :EOF return to?

+0

Danke, aber was ist, wenn nicht alle Videodateien Ich habe den Ordner eine Untertitel-Datei hat? –

+0

@ LuisGómezGuzmán In diesem Fall gibt die Batch-Datei eine Fehlermeldung aus, die Sie wahrscheinlich beim Lesen der Kommentare gesehen oder zumindest gelesen haben, und die Batch-Datei tut nichts. Solange Sie uns nicht den Algorithmus mitteilen, der verwendet werden soll, um eine passende * .mkv-Datei für eine * .srt-Datei zu finden, die gescriptet werden kann, kann ich nichts Besseres anbieten. Es ist nicht wirklich möglich, menschliche Sprachintelligenz als Skript zu kodieren. – Mofi

Verwandte Themen