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 来说。

我错过了什么,还是有更好的方法来编码?(我不是任何类型的程序员,我编写的大部分代码都来自反复试验,并从其他脚本中“借用”,所以这可能是一种非常混乱的方式)。

4

2 回答 2

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
于 2012-12-18T18:26:28.217 回答
2

通过解释...

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

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

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

不幸的是,!var!替换不是做替换,直到没有离开。这使得执行替换到 !var:src=dst! 变得困难(如在回答者的解决方案中)价值。

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

...
call :GenS
...

进而:

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

顺便说一句:我很困惑你没有注意到 ECHO %EODNUM% 没有在循环中工作,因为在读取 for 循环期间所有 %var% 替换都进行了。

于 2012-12-19T06:38:01.957 回答