2

1 行を除けば、私が期待するすべてのことを実行するスクリプトがあります。

以前も同様のことをしましたが、これを機能させることはできません。

私が持っているコードはここにあります

@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

現在の日付を変数 EODNUM に置き換える文字列を除いて、csv ファイルの各行を取得し、それ自体で置き換えることを期待していました (これは実行されます...変数のみが設定される前に展開されるため、は何もありません)...遅延展開はこれを解決するはずですが、このコード行を使用できます

set S=!S:%T_DAY%=!EODNUM!!

CMDには!が多すぎると思うからです。

何か不足していますか、これをコーディングするより良い方法はありますか?? (私はどんな種類のプログラマーでもなく、私が書くコードのほとんどは試行錯誤と他のスクリプトからの「借用」から来ているので、これを行うには非常に厄介な方法かもしれません)。

4

2 に答える 2

2

の値を FOR 変数に転送し、!EODNUM!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 は、一度に 1 つの最上位コマンドを読み取り (および env var 置換を行い)、解析し、実行します。

あなたの例では、「for /f ...」コマンドを一度に読み取り、 %var% 置換を解析して実行します。

これが完了すると、for ループが実行され、delayed !var! が実行されます。代用。

残念ながら、!var! 置換は do-substitution-until-none-left ではありません。これにより、(回答者のソリューションのように) !var:src=dst! への置換を実行することが難しくなります。価値。

実行中に保証された置換を取得できる方法が必要になります。これには、for ステートメント、または読み取りと %var% の再置換を含む何かが必要です。これを行う 1 つの方法は、.cmd ファイル内の特定のラベルを呼び出すことができる CALL :LABEL フォームを使用して、このセクションで目的を実行することです。

...
call :GenS
...

その後:

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

ところで: for ループの読み取り中にすべての %var% 置換が行われるため、ループ内で ECHO %EODNUM% が機能していないことに気付かなかったことに困惑しています。

于 2012-12-19T06:38:01.957 に答える