2013-11-01 37 views
0

我有一個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總是等於找到了循環的最後一個元素。所以我可能會得到這樣的輸出。 (添加爲了清楚對準)

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是從未等於 「阿爾法」 或 「查理」。

我需要做些什麼來獲得我正在尋找的功能?

+1

你爲什麼不把內環路的功能還檢查是否需要delayedExpansion? - > http://ss64.com/nt/delayedexpansion .html – npocmaka

回答

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 

因人而異

+0

良好的/ b標誌調用 – PaulH

0

兩個例子:

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

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

這是擺脫我的%dir:〜14%的方便方法,但是一旦我嘗試做比「do echo %%〜b」更爲實質的任何事情,我就會遇到和以前一樣的問題。 – PaulH

0

該報告路徑,以及完整的文件規範。

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

這似乎顯示'myfile.txt'在每個目錄中,而不僅僅是它實際存在的目錄中。 – PaulH

相關問題