2017-06-22 4 views
0

私はディレクトリ内の各ファイルに対してスクリプトを操作するために%% fを使用しようとしていましたが、スクリプトで参照するときは%% fと%%〜nfはそうではありません働いているようだ。私はプログラミングの経験が限られています。私はthis video formatting tutorialのもっと便利なバージョンを作ろうとしています。バッチストア%% fを変数として

私はどのように動作することはできませんが、私は%% fと%%〜nfをスクリプトの残りの部分を参照する変数として保存したいと思います。

@echo off 
set /p FORMAT="Enter File Format: " 
FOR %%f IN (*.%FORMAT%) DO echo %%f 
set TEST=%%f 
echo %TEST% 
cmd/k 

私はこれらを保存することができれば、それは私の問題を解決するだろうが、しかし、これは私が何をしようとしているの長い形で、このスクリプトは、私は、ユーザーを持っている場合、変数にファイルを手動で入力して動作します(% VIDEO%= %% f、%〜nf)。これは理想とはほど遠いですが。

@echo off 
set /p FORMAT="Enter File Format: " 

FOR %%f IN (*.%FORMAT%) DO (
::IDFILE 
for /F "delims=" %%I in ('C:\ffmpeg\bin\ffprobe.exe -v error -show_entries format^=filename -of default^=noprint_wrappers^=1:nokey^=1 "%%f"') do set "FILENAME=%%I" 

for /F "delims=" %%I in ('C:\ffmpeg\bin\ffprobe.exe -v error -select_streams v:0 -show_entries stream^=codec_name -of default^=noprint_wrappers^=1:nokey^=1 "%%f"') do set "Vcodec=%%I" 

for /F "delims=" %%I in ('C:\ffmpeg\bin\ffprobe.exe -v error -select_streams a:0 -show_entries stream^=codec_name -of default^=noprint_wrappers^=1:nokey^=1 "%%f"') do set "Acodec=%%I" 

echo %FILENAME% is using %Vcodec% and %Acodec% codecs 

if %Vcodec% == h264 (echo DO NOT CONVERT VIDEO) else (echo CONVERT VIDEO) 
if %Acodec% == ac3 (echo DO NOT CONVERT AUDIO) else (echo CONVERT AUDIO) 
timeout /t 5 

:: COPY V FIX A 
if %Vcodec% == h264 if not %Acodec% == ac3 (echo Copying Video, Converting Audio 
timeout /t 5 
C:\ffmpeg\bin\ffmpeg.exe -i "%%f" -map 0 -vcodec copy -scodec copy -acodec ac3 -b:a 640K "%%~nf"-AC3.mkv) 

:: FIX V COPY A 
if not %Vcodec% == h264 if %Acodec% == ac3 (echo Converting Video, Copying Audio 
timeout /t 5 
C:\ffmpeg\bin\ffmpeg.exe -i "%%f" -map 0 -vcodec libx264 -scodec copy -acodec copy "%%~nf-"h264.mkv) 

:: FIX V FIX A 
if not %Vcodec% == h264 if not %Acodec% == ac3 (echo Converting Video, Converting Audio 
timeout /t 5 
C:\ffmpeg\bin\ffmpeg.exe -i "%%f" -map 0 -vcodec libx264 -scodec copy -acodec ac3 -b:a 640K "%%~nf"-h264-AC3.mkv) 

:: COPY V COPY A 
if %Vcodec% == h264 if %Acodec% == ac3 (echo "Doesn't require any Conversion") 
) 
pause 
cmd/k 

答えて

2

はずっとそのでそれを逃しました!あなたのコードで

@echo off 
set /p FORMAT="Enter File Format: " 

FOR %%f IN (*.%FORMAT%) DO (
set "video=%%f" 
set "namepart=%%~nf" 
call :idfile 
) 
pause 
goto :eof 

.. then the remainder of your code, except Modify the comment `::IDfile` to a 
    label `:idfile` (1 fewer colon) remove the `)` before the `pause` 
    and replace the `cmd /k` with `goto :eof` and replace `%%f`, `%%~nf` with 
    `%video%`, `%namepart%` respectively. 

2つの大きな問題:delayed expansionにあるスタイルのコメント( - - :: `のとUE(SO上の多くの、多くの参照があるかについては、ちょうどsearch上部のバーにある機能を使用します)実際にラベルが壊れている)を、ラベルが許可されていないコードブロック(括弧で囲まれた一連の行)に置き換えます。

私が提案した変更は、コードの肉全体をサブルーチンに変えるだけです。

はまた、(おそらく好ましい)

@echo off 
set /p FORMAT="Enter File Format: " 

FOR %%f IN (*.%FORMAT%) DO call :idfile "%%f" 

pause 
goto :eof 

にコードを変更して、代わりにサブルーチンでvideonamepartを使用する、使用することができ%~1%%~n1%1は、サブルーチンの最初のパラメータであるので; ~は引用符を削除します(%%fにスペースが含まれている場合は正しく処理されます))

+0

本当に助けてくれてありがとうございます。実際の変換名の部分に%%〜n1を使用しようとすると、正しく読み込まれていないようですが、%%〜n1を使ってみました。 ':: COPYのVのFIX %Vcodecの%の== H264ない場合は%Acodec%== AC3()も "" なしで試してみました( "N1〜%%" オーディオ エコーを変換、ビデオのコピーエコー 一時停止 場合C:\ ffmpeg \ bin \ ffmpeg.exe -i "%1" -map 0 -vcodecコピー-scodecコピー-acodec ac3 -b:640K "%%〜nf" -AC3.mkv) ' そしてそれ'%%〜n1' 'または' %%〜n1 'を読み戻し、%%〜n1というファイルになります – RyanMe321

0

このようにしてみてください:

@echo off 
set /p FORMAT="Enter File Format: " 
FOR %%f IN (*.%FORMAT%) DO ( 
    echo %%f 
    set TEST=%%f 
) 
echo %TEST% 

または

@echo off 
setlocal enableDelayedExpansion 
set /p FORMAT="Enter File Format: " 
FOR %%f IN (*.%FORMAT%) DO ( 
    echo %%f 
    set TEST=%%f 
    echo !TEST! 
) 
関連する問題