2012-12-18 96 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%,并忘记重置它(因为它看起来像它的工作)。这是我的错误。幸运的是,回声并不需要任何东西。感谢您的解释,但。总是很高兴知道事情如何/为什么起作用。 –