Findstr不接受变量CMD

时间:2012-11-01 13:43:21

标签: batch-file cmd

目的是扫描给定文件夹中的媒体文件,并将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'部分没有正常工作,但我无法得到错误,因为闪烁的眼睛它消失了&我无法排除故障

1 个答案:

答案 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