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

时间:2013-11-01 17:08:18

标签: 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循环中找到的最后一个元素。所以我可能得到这样的输出。 (为了清晰起见,添加了对齐方式)

i = Directory of c:\alpha\myfile.txt
dir =            c:\charlie\myfile.txt
i = Directory of c:\bravo\myfile.txt
dir =            c:\charlie\myfile.txt
i = Directory of c:\charlie\myfile.txt
dir =            c:\charlie\myfile.txt

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

我需要做些什么才能获得我正在寻找的功能?

3 个答案:

答案 0 :(得分:0)

两个例子:

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

for /r %%a in (.) do echo %%~fa

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

尝试:

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

请注意,在内部子例程: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