2015-05-19 91 views
1

我的代碼塊:爲什麼我的BAT文件變量不被覆蓋?

@ECHO OFF 

SET "SRCFOLDER=C:\Users\MyUserName\Desktop\PhotoTests" 

SET "TEMPCODE=Hi" 
ECHO %TEMPCODE% 
ECHO. 

FOR /F "tokens=*" %%G IN ('DIR /B %SRCFOLDER%') DO (
    ECHO %%G 
    CALL tooltipInfo.bat %%G 19 | FIND /C "Star" > test.txt 
    SET /P TEMPCODE=<test.txt 
    ECHO %TEMPCODE% 
    ECHO. 
) 

SET /P TEMPCODE=<test.txt 
ECHO %TEMPCODE% 
ECHO. 

PAUSE 

我對輸出困惑,因爲我注意到,在for循環沒有被我所想覆蓋的變量應該是「的test.txt」的內容,每次運行FOR循環都會有所不同。

對於本示例的目的,文件tooltipInfo.bat將根據文件屬性中記錄的評級回顯「1 Star」或「3 Stars」等文本字符串。 FIND語句應該導致將「0」或「1」保存到test.txt文件中

輸出是:

Hi 

Canon_Locked.JPG 
Hi 

Nikon_Locked.JPG 
Hi 

0 

Press any key to continue . . . 

我可以知道爲什麼TEMPCODE變量沒有在循環覆蓋,保留的「喜」的原始值。但是,在最後一段代碼中,它能夠讀取並回顯文件的實際內容。

+0

另一個程序員絆倒也開啓延遲擴展通過延期擴張。我們可以讓批處理文件已經死掉嗎?語法比大多數程序員都舊,並且完全鈍。我對任何批量出發的人的建議:改用Powershell。 –

回答

1

這是使用FOR和括號時常見的錯誤。問題在於,默認情況下,當線條第一次讀取時,將評估()之間的每個變量,然後在FOR的每次迭代中重新使用該變量。

如果循環(通過SET)中的變量發生變化,那麼你將需要改變%!的括號內的變量,並使用setlocal

SETLOCAL enabledelayedexpansion 
FOR /F "tokens=*" %%G IN ('DIR /B %SRCFOLDER%') DO (
    ECHO %%G 
    CALL tooltipInfo.bat %%G 19 | FIND /C "Star" > test.txt 
    SET /P TEMPCODE=<test.txt 
    ECHO !TEMPCODE! 
    ECHO. 
)