[英]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.