@echo off && setlocal DisableDelayedExpansion @title bmx2enc.bat v0.5 :: 使い方 :: このバッチファイルに, BMS のファイルかフォルダをドラッグ&ドロップ (もしくは SendTo) :: BOF2010 フォルダと 5vs7 フォルダを同時ドロップして, 寝てる間に一括 mp3 変換とか可能 :: config : 以下の項目を適宜書き換える**************************************************** set BMX="C:\hoge\bmx2wav" set OUT="E:\bmx2output" set INI="bmx2enc.ini" set UBM="C:\hoge\uBMplay.exe" set LR2="C:\hoge\LR2body.exe" set ENC="lame.exe -b 192 -S" set LRA="-NS" set SUB=0 :: ********************************************************************************ここまで :: 補足 :: BMX="bmx2wavフォルダのフルパス" :: OUT="エンコード出力専用フォルダのフルパス" // あらかじめフォルダ作っておくこと :: INI="bmx2wavc.exe が使う設定ファイル名" // 面倒なら bmx2wav.ini を指定してね :: UBM="uBMplay.exe のフルパス" // :: LR2="LR2body.exe のフルパス" // :: ENC="Encoder.exe -option -option …" // %OUT% に置いて半角スペース区切りで引数 :: LRA="LR2 オプション" // "-A":auto "-NS":noscore "":normal :: SUB=0 なら処理タイプを選択する // 処理タイプ固定 1:bmx 2:uBM 3:LR2 :: 準備------------------------------------------------------------------------------------ :: bmx2wav から専用の設定を作って config で指定しておく :: [出力ファイルのパスを以下のテンプレートを使用する] :必ずチェック :: [ファイルパスに使用できない文字があった場合削除する] :必ずチェック :: [E:\bmx2output\[BOF2010] %#GENRE# - %#TITLE# - %#ARTIST# - %J.wav] :: ~~~~~~~~~~~~~~ ~~~~ :: 先頭に↑任意のフォルダパスを指定, 中間は自由, 拡張子は必ず .wav↑ :: エンコード実行ファイルは, エンコード出力専用フォルダに置いておく :: :: エンコード出力専用フォルダパスは, 以下の三点を対応させること :: (1) この bat の config における指定 (例 set OUT="D:\hoge\piyo\") :: (2) bmx2wavc 設定ファイル内での指定 (例 OutputTemplateSource=D:\Hoge\piyo\[template].wav) :: (3) 実際の,出力フォルダのパスの名前 (例 D:\Hoge ディレクトリ直下にある Piyo フォルダ) :: :: エンコーダ設定例 :: set ENC="lame.exe -b 192 -S" // Lame で CBR 192kbps MP3 に変換 (-S 進捗状況を非表示) :: set ENC="venc.exe -q6" // aoTuV で VBR 192kbps OGG に変換 :: set ENC="oggenc2.exe -q 6" // oggenc2 で VBR 192kbps OGG に変換 :: oggenc2.87-aoTuVb5.7-Lancerx64-SSE2 など改造版は, oggenc2.exe にリネームしてから使う :: set ENC="faac.exe -q 300 -w --mpeg-vers 4" // FAAC で MPEG-4 AAC LC [MP4 v2] に変換 :: ---------------------------------------------------------------------------------------- :: 仕様 : cmd.exe に一度に渡せる引数の長さの制限. XP以降 8191 文字, 2000/NT系 2047 文字 :: 仕様 : & の連続を含む引数は, cmd.exe に渡す前に対処しないと無理ぽ (バッチだけじゃ無理) :: 2010/09/15 機能統合, 先頭に&があったり^を含む引数で心が折れた, bmx2enc_temp.txt :: 2010/09/10 =;, %&!@() を含む名前のアイテムドロップ. & は先頭以外で不連続なら可 :: 2010/09/09 ファイル+フォルダの複数同時ドロップ, 譜面数カウンタ, エラー関係 set UBA="-SP" set DAT=%date:/=-% set DAN=%time:~0,8% :: バッチパラメータが =;, %& を含む場合の対策, 多重起動の抑制----------------------------- echo パスをチェックしています ... setlocal EnableDelayedExpansion set cmdline=!cmdcmdline:*" =! set cmdline=!cmdcmdline:~0,-1! set fq= set fg= set fb=true set cmdline2= set n=0 if not defined cmdline goto result :for set c=!cmdline:~%n%,1! if not defined c goto :next if defined fq ( if !c!==^" set fq=& if defined fg set cmdline2=!cmdline2!^" ) else ( if !c!==^ if not defined fb ( set fb=true if defined fg ( set fg= set cmdline2=!cmdline2!^" ) ) if not !c!==^ if defined fb ( set fb= if not !c!==^" ( set fg=true set cmdline2=!cmdline2!^" ) ) if !c!==^" set fq=true& if defined fg set cmdline2=!cmdline2!^" ) set cmdline2=!cmdline2!!c! set /a n+=1 goto :for :next if defined fq set cmdline2=!cmdline2!^"& if defined fg set cmdline2=!cmdline2!^" if defined fg set cmdline2=!cmdline2!^" call :main !cmdline2:%%=%%%%! 4>>%0 exit :main :: --------------------------------------------------------------------------------ここまで :: ちゃんと走るかチェック開始 (うざければ削って)------------------------------------------- set TMP= if not exist %BMX%\ ( echo %BMX:~1,-1% echo この bmx2wav 実行ファイルディレクトリは存在しないか、無効なパスです。 echo bmx2enc.bat 内 config の set BMX="" 行を適宜書き換えてください。 echo: pause endlocal exit ) else ( cd /d %BMX% if not exist bmx2wavc.exe ( echo %BMX:~1,-1% echo この実行ファイルディレクトリに bmx2wavc.exe が見つかりません。 goto ending ) if not exist %INI% ( echo %BMX:~1,-1% echo この実行ファイルディレクトリに echo エンコード専用の設定ファイル %INI% が見つかりません。 echo bmx2enc.bat 内 config の set INI="" 行を確認してください。 echo: echo エンコード専用の設定ファイルそのものが存在しない場合は、 echo GUI 版 bmx2wav.exe の 詳細設定 - 出力タブ にて echo エンコード出力専用ディレクトリ %OUT% のパスを指定し、 echo その設定に任意の名前をつけて保存するか、またはコピーしてください。 echo: echo 以下は %INI% の記述例です。Use... と Remove... は必ず 1 にしてね echo CancelAtResounding=1 echo UseOutputTemplate=1 echo OutputTemplateSource=E:\bmx2output\[ %%#ARTIST# ] %%#TITLE#_%%J.wav echo RemoveCanNotUseCharAsFilePath=1 goto ending ) ) if not exist %OUT%\ ( echo %OUT:~1,-1% echo このエンコード出力専用ディレクトリは存在しません。 echo bmx2enc.bat 内 config の set OUT="" 行を適宜書き換えてください。 echo: echo ここには %INI% で設定した MP3 出力専用ディレクトリを指定します。 echo たとえば %INI% の出力テンプレートが以下だったならば、 echo: echo OutputTemplateSource=E:\bmx2output\[ %%#ARTIST# ] %%#TITLE#_%%J.wav echo: echo bmx2enc.bat 内 *config* は以下のようにします。 echo: echo set OUT="E:\bmx2output" goto ending ) else ( cd /d %OUT% for /f %%F in (%ENC%) do ( set ENCABS=%%~dpF set ENCREL=%%F set Vendor=%%~nxF ) if not exist !ENCABS!\ ( echo set ENC="" の指定が誤っています。 goto ending ) else ( if not exist !ENCREL! ( echo %OUT:~1,-1% echo このディレクトリにエンコーダ !Vendor! が見つかりません。 echo もし半角スペースを含む相対パスを set ENC="" に指定していた場合、 echo コマンドライン オプション と混同するのでパスを変更してください。 echo: echo コマンドライン エンコーダ は以下などから入手してください : echo lame.exe ^(MP3^) : http://www.rarewares.org/mp3-lame-bundle.php echo venc.exe ^(OGG^) : http://www.geocities.jp/aoyoume/aotuv/ echo oggenc2.exe ^(OGG^) : http://www.rarewares.org/ogg-oggenc.php echo faac.exe ^(AAC^) : http://www.rarewares.org/aac-encoders.php echo neroAacEnc.exe ^(MP4^) : http://ftp6.nero.com/tools/ echo flac.exe ^(FLAC^) : http://www.rarewares.org/lossless.php goto ending ) ) if exist *.wav ( echo %OUT:~1,-1% echo このエンコード出力専用ディレクトリに WAV ファイルが存在します。 echo 安全性の観点および変換エラー記録の都合上、バッチ処理を中止します。 echo このディレクトリから WAV ファイルを退避させてください。 goto ending ) ) :: OutputTemplateSource と set OUT= の内容を比較してパスが同一か判定する案 :: あとまわし for /f "delims=" %%F in ('echo %UBM%') do set TMP="%%~dpF" for /f "delims=" %%F in ('echo %UBM%') do set DXV="%%~nxF" if not exist !TMP!\ ( echo !TMP:~1,-1! echo この uBMplay 実行ファイルディレクトリは存在しないか、無効なパスです。 echo bmx2enc.bat 内 config の set UBM="" 行を適宜書き換えてください。 goto ending ) else ( cd /d !TMP! if not exist uBMplay.exe ( echo %TMP:~1,-1% echo 指定されたパスに uBMplay.exe が見つかりません。 goto ending ) if exist uBMplay.exe if not !DXV!=="uBMplay.exe" ( echo uBMplay.exe が存在しますが、config の指定が誤っています。 echo set UBM=%UBM% goto ending ) ) for /f "delims=" %%F in ('echo %LR2%') do set TMP="%%~dpF" for /f "delims=" %%F in ('echo %LR2%') do set DXV="%%~nxF" if not exist !TMP!\ ( echo !TMP:~1,-1! echo この LR2 実行ファイルディレクトリは存在しないか、無効なパスです。 echo bmx2enc.bat 内 config の set LR2="" 行を適宜書き換えてください。 goto ending ) else ( cd /d !TMP! if not exist LR2body.exe if not exist LR2bodyDD.exe ( echo %TMP:~1,-1% echo 指定されたパスに LR2body.exe もしくは LR2bodyDD.exe が見つかりません。 goto ending ) if exist LR2body.exe if not !DXV!=="LR2body.exe" ( echo LR2body.exe が存在しますが、config の指定が誤っています。 echo set LR2=%LR2% goto ending ) if exist LR2bodyDD.exe if not !DXV!=="LR2bodyDD.exe" ( echo LR2bodyDD.exe が存在しますが、config の指定が誤っています。 echo set LR2=%LR2% goto ending ) ) :: --------------------------------------------------------------------------------ここまで :: メイン --------------------------------------------------------------------------------- setlocal DisableDelayedExpansion cls cd /d %BMX% bmx2wavc.exe -version echo: echo Now Loading ... if exist bmx2enc_temp.txt (del bmx2enc_temp.txt) set TMP= set CNT=0 set ALL=0 :count if .%1==. goto listed set FLD=%1 call set FLD=%%FLD:^^^=「caretcaret」%% for /r %FLD:「caretcaret」=^% %%A in (*.bms *.bme *.bml *.pms) do ( call set /a CNT=%%CNT%%+1 echo ""%%A"">> bmx2enc_temp.txt 2>>&1 ) if /i "%~x1"==".bms" goto attrbms if /i "%~x1"==".bme" goto attrbms if /i "%~x1"==".bml" goto attrbms if /i "%~x1"==".pms" goto attrbms shift goto count :attrbms set TMP=%1 call set TMP=%%TMP:^&=「ampersand」%% call set /a CNT=%%CNT%%+1 echo "%TMP:「ampersand」=^&%">> bmx2enc_temp.txt 2>>&1 shift goto count :listed echo: if not defined CNT ( echo Error : BMx Files ^(.bms .bme .bml .pms^) Not Found. echo Drop the BMx Files, or Folders, or Both, to this Batch File. goto ending ) if %CNT%==0 ( echo 拡張子 .bms .bme .bml .pms のファイルがないので終了します。 goto ending ) call echo BMx : %%CNT%% Files Found. echo: call set ALL=%%CNT%% cd /d %OUT% for /f %%F in (%ENC%) do ( set ENCABS=%%~dpF set ENCREL=%%F set Vendor=%%~nxF ) set TMPVND=%Vendor% if not %Vendor%==lame.exe if not %Vendor%==venc.exe if not %Vendor%==oggenc2.exe ^ if not %Vendor%==faac.exe set Vendor=unknown cd /d %BMX% set CNT=0 set SUC=0 set ERR=0 set BAK=0 set BMXerr=0 set ENCerr=0 set ERRTYPE= set TMP= set choice= if "%SUB%"=="1" goto bmxsub if "%SUB%"=="2" goto uBMsub if "%SUB%"=="3" goto LR2sub echo 1. bmx2enc echo 2. uBMplay echo 3. LR2play echo: :select set /p choice=Select the number. ^> if not "%choice%"=="" set choice=%choice:~0,1% if "%choice%"=="1" echo: && goto bmxsub if "%choice%"=="2" goto uBMsub if "%choice%"=="3" goto LR2sub goto select :: ---------------------------------------------------------------------------------------- :: サルブーチン --------------------------------------------------------------------------- :bmxsub echo 一括処理を開始。ウィンドウを閉じるか Ctrl+C で中止します。 if "%choice%"=="1" ( echo WScript.Sleep 300 > tmp.vbs cscript //NoLogo tmp.vbs del tmp.vbs ) else ( pause ) echo: if not exist bmx2enc_temp.txt ( echo 変換する譜面のリストが見つかりません。一括変換処理を中止します。 goto ending ) for /f "delims=" %%F in (bmx2enc_temp.txt) do ( set "TMP=%%F" call set /a CNT=%%CNT%%+1 call echo BMx no.%%CNT%% / %%ALL%% : bmx2wavc.exe -config %INI% "%%F" if errorlevel 1 call set /a BMXerr=%%BMXerr%%+1 call :encode ) ) :result if not defined CNT ( echo Error : BMx Files ^(.bms .bme .bml .pms^) Not Found. echo Drop the BMx Files, or Folders, or Both, to this Batch File. goto ending ) if %CNT%==0 ( echo 拡張子 .bms .bme .bml .pms のファイルがないので終了します。 goto ending ) echo ----------------------------------------------------------------------- echo: bmx2wavc.exe -version echo 一括変換完了 call echo %%CNT%% 件中 %%SUC%% 件のファイルの変換に成功しました。 cd /d %OUT% if %ERR%==0 ( echo ^(%date:/=-% %time:~0,8%^) error No.0 : PERFECT>> bmxerror.txt 2>>&1 ) else ( call echo %%CNT%% 件中 %%ERR%% 件のファイルをエラーとして記録しました。 echo %OUT:"=%\bmxerror.txt echo: if not %BMXerr%==0 call echo %%ERR%% 件中 %%BMXerr%% 件は 譜面側 エラーです。 if not %ENCerr%==0 ( call echo %%ERR%% 件中 %%ENCerr%% 件は 外部エンコード エラーです。 if not %BAK%==0 ( call echo %%ENCerr%% 件中 %%BAK%% 件の 外部エンコード エラーのバックアップ作成に成功しました。 ) ) ) echo -------------------------------------------------------------------------------->> bmxerror.txt 2>>&1 echo: call echo BMx : %%CNT%% call echo ENC : %%SUC%% / %%CNT%% call echo ERR : %%ERR%% / %%CNT%% if not %ENCerr%==0 call echo BAK : %%BAK%% / %%ENCerr%% echo RUN : %DAT% %DAN% echo END : %date:/=-% %time:~0,8% goto ending :: ---------------------------------------------------------------------------------------- :uBMsub echo: for /f "delims=" %%F in (bmx2enc_temp.txt) do ( call set /a CNT=%%CNT%%+1 call echo PLAY %%CNT%% / %%ALL%% : %UBM% %UBA:~1,-1% "%%F" ) if %CNT%==0 ( echo 拡張子 .bms .bme .bml .pms のファイルがないので終了します。 goto ending ) echo: call echo BMx : %%CNT%% echo RUN : %DAT% %DAN% echo END : %date:/=-% %time:~0,8% goto ending :LR2sub echo: for /f "delims=" %%F in (bmx2enc_temp.txt) do ( set TMP=%%F call set TMP="%%TMP:~2,-2%%" call set /a CNT=%%CNT%%+1 call echo PLAY %%CNT%% / %%ALL%% : call %%LR2%% %%LRA:~1,-1%% %%TMP%% ) if %CNT%==0 ( echo 拡張子 .bms .bme .bml .pms のファイルがないので終了します。 goto ending ) echo: call echo BMx : %%CNT%% echo RUN : %DAT% %DAN% echo END : %date:/=-% %time:~0,8% goto ending :: ---------------------------------------------------------------------------------------- :ending cd /d %BMX% echo: pause if exist bmx2enc_temp.txt (del bmx2enc_temp.txt) if exist procterm.exe (procterm conime.exe) endlocal exit :: ---------------------------------------------------------------------------------------- :encode cd /d %OUT% if exist *.wav ( if %Vendor%==lame.exe ( echo WAV ファイルを MP3 フォーマットに変換しています。 ... for %%e in (*.wav) do ( set "Befor=%%e" call set "Befor=%%Befor:^^^=「caretcaret」%%" call set "After=%%Befor:.wav=.mp3%%" call %%ENC:~1,-1%% "%%Befor:「caretcaret」=^%%" "%%After:「caretcaret」=^%%" if errorlevel 1 ( call rename "%%Befor:「caretcaret」=^%%" "%%Befor:「caretcaret」=^%%.bak" if errorlevel 1 ( echo エンコード失敗。バックアップ作成に失敗しました。 del "%%e" ) else ( echo エンコード失敗。バックアップを作成しました。 call set /a BAK=%%BAK%%+1 ) set ERRTYPE=ENC call set /a ENCerr=%%ENCerr%%+1 goto failed ) else ( del "%%e" goto encSUC ) ) ) if %Vendor%==venc.exe echo WAV ファイルを OGG フォーマットに変換しています。 ... if %Vendor%==oggenc2.exe echo WAV ファイルを OGG フォーマットに変換しています。 ... if %Vendor%==faac.exe echo WAV ファイルを AAC フォーマットに変換しています。 ... if %Vendor%==unknown echo %TMPVND% で WAV ファイルのエンコードを試みます。 ... for %%e in (*.wav) do ( set "Befor=%%e" call set "Befor=%%Befor:^^^=「caretcaret」%%" call %%ENC:~1,-1%% "%%Befor:「caretcaret」=^%%" if errorlevel 1 ( call rename "%%Befor:「caretcaret」=^%%" "%%Befor:「caretcaret」=^%%.bak" if errorlevel 1 ( echo エンコード失敗。バックアップ作成に失敗しました。 del "%%e" ) else ( echo エンコード失敗。バックアップを作成しました。 call set /a BAK=%%BAK%%+1 ) set ERRTYPE=ENC call set /a ENCerr=%%ENCerr%%+1 goto failed ) else ( del "%%e" goto encSUC ) ) ) else ( goto failed ) :encSuc call set /a SUC=%%SUC%%+1 echo ... 完了 echo: cd /d %BMX% exit /b :failed call set /a ERR=%%ERR%%+1 if not defined ERRTYPE set ERRTYPE=BMX call set "TMP=%%TMP:^&=「ampersand」%%" call set "TMP=%%TMP:~2,-2%%" (call echo ^(%date:/=-% %time:~0,8%^) No.%%ERR%% %%ERRTYPE%% error : "%%TMP:「ampersand」=^^&%%")>> bmxerror.txt 2>>&1 call echo error No.%%ERR%% : この譜面を %OUT:"=%\bmxerror.txt に記録しました。 set ERRTYPE= echo: cd /d %BMX% exit /b