2012-12-18 94 views
2

我有一個腳本,除了一行之外,它可以完成我期望它所做的一切。延遲擴展在延遲擴展中不起作用

我之前做過類似的工作,但是我無法得到這個工作。

我已經得到了代碼是在這裏

@echo off 
SETLOCAL ENABLEDELAYEDEXPANSION 

::Set Path to be folder of Sage Files 
SET PATH=C:\Welcome\Progs\SitesDataSetups\GeorgeYarmouth 

::set date variables 
for /f "tokens=1" %%i in ('date /t') do set thedate=%%i 
set mm=%thedate:~3,2% 
set dd=%thedate:~0,2% 
set yyyy=%thedate:~6,4% 

::Set T_DAY variable to date in ddmmyy format 
set T_DAY=%dd%%mm%%yyyy:~2% 

c: 
cd\ 
cd %path% 
for /f "usebackq tokens=* delims= " %%P in (`dir sage*.csv /od /b`) do (
    set SAGE=%%P 
    set SAGE2=!SAGE:~0,8!_EDITED 
    set EODNUM=!SAGE:~4,4! 
    for /f "tokens=* delims= " %%A in (%%P) do (
     echo %EODNUM% 
     set S=%%A 

***This line is the problem*** 
     set S=!S:%T_DAY%=%EODNUM%! 

     echo.!S! >> %PATH%\TEST\!SAGE2!.csv 
    ) 
) 
endlocal 

我期待所將採取的CSV文件的每一行,並取代它與本身,除了與字符串當前日期的更換與變量EODNUM(其中它......只有變量被設置之前它擴大,所以是無)...延遲擴展應該解決這個問題,而是因爲我覺得我可以用這行代碼

set S=!S:%T_DAY%=!EODNUM!! 

它對於CMD來說太多了!

我錯過了什麼,還是有更好的方法來編碼? (我不是任何類型的程序員,我寫的大部分代碼都來自試驗和錯誤,並且從其他腳本'借用',所以這可能是一個非常混亂的方式)。

回答

2

!EODNUM!的值轉換爲FOR變量,然後使用FOR變量作爲替換字符串。

 echo !EODNUM! 
     set "S=%%A" 
     for /f "delims=" %%E in ("!EODNUM!") do set "S=!S:%T_DAY%=%%E!" 
     echo.!S!>> %PATH%\TEST\!SAGE2!.csv 
+0

輝煌。工作很好,謝謝... –

2

通過解釋...

CMD讀取(和確實的環境變量替換),解析,並在同一時間執行一個頂級命令。

在您的示例中,它會立即讀取「for/f ...」命令,解析並執行%var%替換。

一旦完成,它會執行for循環,執行delayed!var!代換。

不幸的是,!var!替代不是直到沒有離開的替代。這使得它很難(如在回答者的解決方案中)在!var:src = dst中執行替換!值。

您將需要一種方式,執行期間你可以得到保證替代。這需要一個for語句,或者需要再次讀取和%var%的內容。這樣做的一個方法是使用CALL:標籤格式,你可以在你的.cmd文件調用到一個特定的標籤,並具有本節做你想要什麼:

... 
call :GenS 
... 

然後:

:GenS 
set S=!S:%T_DAY%=%EODNUM%! 
goto :eof 

順便說一句:我很困惑,你沒有注意到ECHO%EODNUM%不能在循環中工作,因爲在for循環的讀取過程中所有的%var%替換都已完成。

+0

我一直在玩代碼很久,可能以前已經設置%EODNUM%,並忘記重置它(因爲它看起來像它的工作)。這是我的錯誤。幸運的是,回聲並不需要任何東西。感謝您的解釋,但。總是很高興知道事情如何/爲什麼起作用。 –