在for循环Batch中使用For变量时出现问题

时间:2017-05-03 14:15:21

标签: batch-file

我遇到了一些代码问题,我真的不知道如何描述它 但我可以解释什么不起作用

FOR /D /r "%cd%\files\" %%G in ("*") DO (
  echo In folder: %%~nxG
  set /a count=1
  echo %%~fG

  For /R "%%~fG" %%B in ("*.mp3") do (
      call :subroutine "%%~nB"
  ) & echo. >>%archive%.txt

)

如果你想知道子程序的作用:

:subroutine
 echo %count%:%1>>%archive%.txt
 echo %count%: %1
 set /a count+=1
 GOTO :eof

我发现它没有读取第二个for循环中的%%~fG。 有人可以帮助我。

我正在使用SETLOCAL EnableDelayedExpansion

提前谢谢。

2 个答案:

答案 0 :(得分:1)

For /R "%%~fG" %%B in ("*.mp3") do (

可悲的是,for/r无法使用变量作为dirname运行。

我建议

call :anothersubroutine "%%~fG"

和     :anothersubroutine     对于(“* .mp3”)中的/ R“%〜1”%% B(

  • 但我没试过。也许你需要set %% ~fG变成一个变量并使用%var%(没试过......)

答案 1 :(得分:1)

不幸的是,您需要另一个子例程,因为选项在外部之前被解析为令牌。请检查以下示例:

@echo off

echo :::ATTEMPT 1:::
for %%a in (z) do (
    rem the expected delimiter is z and result should be ++::%%a
    for /f "delims=%%a tokens=1,2" %%A in  ("++z%%%%az--") do echo %%A::%%B
)


echo :::ATTEMPT 2:::
for %%a in (z) do (
    call :subr "%%~a"
)

exit /b

:subr
rem the expected delimiter is z and result should be ++::%%a
for /f "delims=%~1 tokens=1,2" %%A in  ("++z%%%%az--") do echo %%A::%%B

输出是:

  

::: ATTEMPT 1 :::

     

++ž:: ZZ -

     

::: ATTEMPT 2 :::

     

++ :: %%一个

正如您在第一次尝试中看到的那样,%%a符号被视为分隔符。但是子例程参数会立即被解析,因此可以使用它们。 要使代码正常工作,您可以尝试使用:

FOR /D /r "%cd%\files\" %%G in ("*") DO (
  echo In folder: %%~nxG
  set /a count=1
  echo %%~fG

 call ::innerFor "%%~fG"

)
...
exit /b %errorlevel%
:innerFor
  For /R "%~1" %%B in ("*.mp3") do (
      call :subroutine "%%~nB"
  ) & echo. >>%archive%.txt