Batch file 延迟扩展不';不能在延迟膨胀内工作

Batch file 延迟扩展不';不能在延迟膨胀内工作,batch-file,cmd,delayedvariableexpansion,Batch File,Cmd,Delayedvariableexpansion,我有一个脚本,除了一行之外,它完成了我期望它做的一切 我以前也做过类似的工作,但我不能让这个工作 我的密码在这里 @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

我有一个脚本,除了一行之外,它完成了我期望它做的一切

我以前也做过类似的工作,但我不能让这个工作

我的密码在这里

@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
我原以为is会将csv文件的每一行都替换为它自己,除了用变量EODNUM替换当前日期的字符串(它会这样做…只有变量在设置之前展开,所以什么都没有)。。。延迟的扩展应该可以解决这个问题,但是我可以使用这行代码

set S=!S:%T_DAY%=!EODNUM!!
因为我觉得太多了s代表CMD


是我遗漏了什么,还是有更好的编码方法??(我不是任何类型的程序员,我编写的大多数代码都是反复试验和从其他脚本“借用”而来的,因此这可能是一种非常混乱的方式)。

传递
的价值!伊奥德纳姆到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

传输
的值!伊奥德纳姆到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

作为解释

CMD一次读取(并执行env-var替换)、解析和执行一个顶级命令

在您的示例中,它一次读取“for/f…”命令,解析并执行%var%替换

完成后,它将执行for循环,执行delayed!瓦尔!替代品

不幸的是!瓦尔!替代不是一个做替代,直到没有留下。这使得很难(在回答者的解决方案中)将替换执行到!var:src=dst!价值观

您将需要一种方法,在执行过程中,您可以得到保证的替换。这需要一个for语句,或者需要再次读取并替换%var%的内容。一种方法是使用CALL:LABEL表单,在该表单中,您可以调用.cmd文件中的特定标签,并让此部分执行您想要的操作:

...
call :GenS
...
然后:

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

顺便说一句:我很困惑,你没有注意到回音%EODNUM%没有在循环中工作,因为在读取for循环的过程中,所有%var%都被替换了。

作为解释

CMD一次读取(并执行env-var替换)、解析和执行一个顶级命令

在您的示例中,它一次读取“for/f…”命令,解析并执行%var%替换

完成后,它将执行for循环,执行delayed!瓦尔!替代品

不幸的是!瓦尔!替代不是一个做替代,直到没有留下。这使得很难(在回答者的解决方案中)将替换执行到!var:src=dst!价值观

您将需要一种方法,在执行过程中,您可以得到保证的替换。这需要一个for语句,或者需要再次读取并替换%var%的内容。一种方法是使用CALL:LABEL表单,在该表单中,您可以调用.cmd文件中的特定标签,并让此部分执行您想要的操作:

...
call :GenS
...
然后:

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

顺便说一句:我很困惑,你没有注意到回音%EODNUM%没有在循环中工作,因为在读取for循环的过程中,所有%var%都被替换了。

我已经玩了很长时间的代码,以前可能已经设置了%EODNUM%,但忘记了重置它(如果这样的话,它看起来会工作)。那是我的错误。。幸运的是,实际上什么都不需要回声。谢谢你的解释。知道事情如何/为什么运行总是很好的。我已经玩了很长时间的代码,可能之前已经设置了%EODNUM%,但忘记了重置它(如果这样的话,它看起来会工作)。那是我的错误。。幸运的是,实际上什么都不需要回声。谢谢你的解释。知道事情如何/为什么运作总是好的。