0

目的は、特定のフォルダーでメディアファイルをスキャンし、mediainfoをinfo.txtに送信することですが、特定のテキスト文字列を持つファイルのみをスキャンするオプションをユーザーに提供することもできます。私のバットファイル:

@echo off
setLocal EnableDelayedExpansion
echo. >info.txt
set /P "folder=Enter folder path: "
set /P "_input=Search all files (y/n): "

if /I "%_input%" == "y" (
    dir %folder% /B /O:N | findstr /I ".wmv$ .mpg$ .mkv$ .mpeg$ .mp4$ .avi$" >filename.txt 
    for /f "tokens=* delims= " %%a in ('type filename.txt') do ( 
    set _in=%_in%%%a 
    mediainfo --Inform=file://template.txt "%folder%!_in!" >>info.txt 
    echo. >>info.txt 
    )
) else ( 
    set /P "_str=Enter file string: " 
    dir %folder% /B /O:N | findstr /I "%_str%" >filename.txt
    for /f "tokens=* delims= " %%a in ('type filename.txt') do ( 
    set in=%in%%%a 
    mediainfo --Inform=file://template.txt "%folder%!in!" >>info.txt 
    echo. >>info.txt 
    )
)

del filename.txt
cls
pause

ifループの最初の部分は正しく機能しますが、「else」の部分は機能しませんが、目のちらつきで消えてしまい、トラブルシューティングできないため、エラーを取得できません。

4

1 に答える 1

2

ECHOをオンのままにしてCLSを削除した場合、またはCLSの前に一時停止した場合は、トラブルシューティングを行うことができます。

ブロック内で_strを設定し、通常の展開で値を使用しようとしているため、ELSEブロックは失敗しています。遅延拡張を使用する必要があります。

SETステートメントが通常の展開を使用しているため、最初のIFブロックでさえ間違っているように見えます。最終結果は、各反復が現在のファイル名をmediainfoに渡すだけであり、これは実際には意味があります。どちらのブロックにも_in変数は必要ないようです。

あなたのコードは必要以上に複雑です:私は以下があなたが探している結果を与えると信じています:

@echo off
setlocal
echo. >info.txt
set /P "folder=Enter folder path: "
set /P "_input=Search all files (y/n): "
if /i "_input" == "y" (
    set "_mask=*.wmv *.mpg *.mkv *.mpeg *.mp4 *.avi"
) else (
    set /P "_mask=Enter file string: "
)
if /i "_input" neq "y" set "_mask=*%_mask%*"
pushd "%folder%"
set "popped="
for %%F in (%_mask%) do (
  if not defined popped popd
  set popped=1
  mediainfo --Inform=file://template.txt "%%F" >>info.txt
  echo. >>info.txt
)
pause

私はそれをさらに一歩進めて、ユーザーがファイル文字列にワイルドカードを指定することを期待します。これにより、ユーザーはより詳細に制御できるようになり、コードがもう少し単純化されます。

@echo off
setlocal
echo. >info.txt
set /P "folder=Enter folder path: "
set /P "_input=Search all files (y/n): "
if /i "_input" == "y" (
    set "_mask=*.wmv *.mpg *.mkv *.mpeg *.mp4 *.avi"
) else (
    set /P "_mask=Enter file mask: "
)
pushd "%folder%"
set "popped="
for %%F in (%_mask%) do (
  if not defined popped popd
  set popped=1
  mediainfo --Inform=file://template.txt "%%F" >>info.txt
  echo. >>info.txt
)
pause
于 2012-11-01T15:15:59.983 に答える