2017-12-17 21 views
-2

と字幕ファイルの名前を変更します。は自動的に私はファイル名で動画ファイルを持っているビデオファイルのバッチスクリプト

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

andalotofstuffは必ずしも各ファイルで同じではない、と.-[]を含めることができる場所。

私はまた、ファイル名と字幕ファイルを持っている:

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

andotherstuffは必ずしも各ファイルで同じではない、と()を含めることができます。

私が望むのは、可能であれば、対応するmkvファイル名を持つファイルsrtのファイル名をバッチスクリプトの名前に変更することです。

いくつかの実際の例を以下に示します。対応する字幕ファイルを持っていない、必ずしもすべてのビデオファイル

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 

注意。

Here私はLinux上で動作するようになっているものを見つけました...ここで

答えて

0

は、このタスクのコメントバッチファイルです:

@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 

それとして使用する本当のファイル名のマッチングアルゴリズムはありませんアルゴリズムは人間の言語知能のようです。したがって、バッチファイルは名前でソートされた* .mkvファイル名の一覧と* .srtファイル名のリストをメモリにロードしてから名前でソートされ、最初の* .srtファイルの名前を最初の* .mkvファイルの名前に変更します* .srtファイルに2番目の* .mkvファイルの名前などを付けます。この単純な解決法は、与えられた例のために働いた。

コマンドechoを挿入することが可能であるが、実際に利用者による検証のためにそれらを実行せずに操作の名前を変更するすべてのファイルを見るためにrenを指揮し、バッチファイルの最後にコマンドpauseを追加するか、コマンドプロンプトウィンドウから、それを実行するために左に実際に* .srtファイルの名前を変更する前に。

使用されているコマンドとその動作方法を理解するには、コマンドプロンプトウィンドウを開き、次のコマンドを実行して、コマンドごとに表示されているすべてのヘルプページをすべてよく読んでください。

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

も読む2>nulの説明についてUsing Command Redirection Operatorsに関するMicrosoftの記事。リダイレクト演算子>は、別のコマンド・プロセスに組み込まれたdirコマンドラインを実行するためのコマンドを実行する前に、このコマンドラインが始まったときに、Windowsのコマンド・インタプリタプロセスのコマンドラインがリテラル文字として解釈されるように FOR にキャレット文字^でエスケープする必要がありますバックグラウンドで

読むthis answerSETLOCALコマンドの詳細およびENDLOCALWhere does GOTO :EOF return to?

+0

おかげで、しかし何のためすべてではないが、ビデオファイル、私はフォルダが字幕ファイルを持っている必要がありますか? –

+0

@LuisGómezGuzmánこの場合、バッチファイルは、あなたが読んでいる可能性が最も高い、または少なくともコメントを読む際に読んだバッチファイルは何もしないので、エラーメッセージを出力します。 * .srtファイルに対応する* .mkvファイルを見つけるために使用するアルゴリズムをスクリプトで記述することができない限り、私はもっと良いものを提供することはできません。人間の言語情報をスクリプトとしてコード化することは、実際には不可能です。 – Mofi

関連する問題