繁体   English   中英

延迟扩展在延迟扩展内不起作用

[英]Delayed expansion doesn't work inside delayed expansion

除了一行之外,我有一个脚本可以执行我期望的所有操作。

我之前也做过类似的事情,但是我无法使它正常工作。

我有的代码在这里

@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太多了!

我是否缺少某些东西,或者有更好的方法编写此代码? (我不是任何类型的程序员,我编写的大多数代码来自反复试验,以及来自其他脚本的“借用”,因此这可能是一种非常麻烦的方式)。

传送!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

作为解释...

CMD一次读取(并进行环境变量替换),解析并执行一个顶级命令。

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

一旦完成,它将执行for循环,执行延迟的!var!。 替代。

不幸的是,!var! 替代不是do-substitution-until-none-left。 这使得很难(如在答复者的解决方案中一样)执行替换到!var:src = dst!中。 值。

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

...
call :GenS
...

接着:

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

顺便说一句:我感到困惑的是,您没有注意到ECHO%EODNUM%在循环中不起作用,因为在读取for循环期间进行了所有%var%替换。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM