Windows 如何为循环变量存储和使用批处理文件的值

Windows 如何为循环变量存储和使用批处理文件的值,windows,batch-file,Windows,Batch File,我有一个Windows批处理文件,试图对目录树中具有给定名称的每个文件执行一些操作 for /f "delims=" %%i in ('dir /s %1 ^| findstr /c:"Directory of"') do ( set dir=%%i echo i = %%i echo dir = %dir:~14% ) 我的问题是dir总是等于for循环中找到的最后一个元素。所以我可以得到这样的输出。(为了清晰起见,增加了对齐) 所以dir永远不等于“alpha”或“

我有一个Windows批处理文件,试图对目录树中具有给定名称的每个文件执行一些操作

for /f "delims=" %%i in ('dir /s %1 ^| findstr /c:"Directory of"') do (
    set dir=%%i
    echo i = %%i
    echo dir = %dir:~14%
)
我的问题是dir总是等于for循环中找到的最后一个元素。所以我可以得到这样的输出。(为了清晰起见,增加了对齐)

所以dir永远不等于“alpha”或“charlie”

我需要做什么才能获得我想要的功能?

两个示例:

for /f "tokens=2*" %%a in ('dir /s ^|findstr /bc:" Directory of"') do echo %%~b


这将报告路径以及完整的文件规范

@echo off
for /r %%a in (myfile.txt) do echo "%%~dpa" and full path is "%%a" & pause
尝试:

请注意,在内部子例程
:process
中,
%%i
不可用。
call:process
需要冒号,而
goto:eof
意味着转到文件的物理结尾(终止子例程),此处需要冒号,但
:eof
是可以理解的,不应指定为标签

也许更好

for /f "delims=" %%i in ('dir /s /b %1') do (
 set dir=%%i
 echo i = %%i
 call :process
)

goto :eof

:process
echo dir = %dir%
goto :eof

YMMV

为什么不将您的功能放在循环中?还要检查是否需要延迟扩展->这似乎表明“myfile.txt”在每个目录中,而不仅仅是它实际存在的目录中。这是一种摆脱我的%dir:~14%的简便方法,但一旦我尝试做比“do echo%%~b”更重要的事情我的问题和以前一样。
@echo off
for /r %%a in (myfile.txt) do echo "%%~dpa" and full path is "%%a" & pause
for /f "delims=" %%i in ('dir /s %1 ^| findstr /c:"Directory of"') do (
 set dir=%%i
 echo i = %%i
 call :process
)

goto :eof

:process
echo dir = %dir:~14%
goto :eof
for /f "delims=" %%i in ('dir /s /b %1') do (
 set dir=%%i
 echo i = %%i
 call :process
)

goto :eof

:process
echo dir = %dir%
goto :eof