目的是扫描给定文件夹中的媒体文件,并将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'部分没有正常工作,但我无法得到错误,因为闪烁的眼睛它消失了&我无法排除故障
答案 0 :(得分:2)
如果您离开ECHO并取消CLS或在CLS之前暂停,您可以排除故障。
您的ELSE块失败,因为您在块中设置了_str,然后尝试通过正常扩展使用该值。您需要使用延迟扩展。
即使您的第一个IF块看起来错误,因为您的SET语句正在使用正常扩展。最终结果是每次迭代都只是将当前文件名传递给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