我有一个脚本可以完成我期望它做的所有事情,除了一行。
之前我做过类似的事情,但我无法让这个工作。
我得到的代码就在这里
@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来说。
我错过了什么,还是有更好的方法来编码? (我不是任何类型的程序员,我编写的大部分代码都来自试错,并且从其他脚本“借用”,所以这可能是一种非常混乱的方式。)
答案 0 :(得分: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
答案 1 :(得分:2)
作为解释......
CMD读取(并进行env var替换),解析并一次执行一个顶级命令。
在您的示例中,它会一次性解析“for / f ...”命令并执行%var%替换。
一旦完成,它就会执行for循环,执行延迟!var!取代
不幸的是,!var!替换不是一个替代 - 直到 - 没有 - 左。这使得很难(如在回答者的解决方案中)执行替换到!var:src = dst!值。
您需要一种在执行期间的方式,您可以获得有保证的替代。这需要一个for-statement,或者涉及读取和%var%再次替换的东西。一种方法是使用CALL:LABEL表单,您可以在其中调用.cmd文件中的特定标签,并让此部分执行您想要的操作:
...
call :GenS
...
然后:
:GenS
set S=!S:%T_DAY%=%EODNUM%!
goto :eof
BTW:我很困惑你没有注意到ECHO%EODNUM%在循环中没有工作,因为在读取for循环期间所有的%var%替换都已完成。