Невозможно написать html из пакетного сценария Windows, используя цикл for

после борьбы в течение 2 дней я все еще не смог найти решение моей проблемы с пакетным скриптом Windows.

то, что я хочу сделать, это прочитать html-файл построчно, и если соответствующее ключевое слово найдено в определенной строке, то заменить эту строку чем-то (теги html и комбинация переменных)

Что бы я ни делал, я всегда получаю сообщение об ошибке «‹ ожидалось в это время» всякий раз, когда я пытаюсь добавить теги html в файл. Похоже, пакетный скрипт не любит html.

Вот мой код:

скрипт.bat

for /F "tokens=1,2,3,4,5,6,7" %%i in (output.txt) do call :process %%i %%j %%k %%l %%m %%n %%o
goto :sendreport

:: procedure to prepare report

:process
    SETLOCAL EnableDelayedExpansion

    set UBENAME=%1
    set UBEVER=%2
    set UBESTAT=%3
    set RUNDATE=%4
    set STARTTIME=%5
    set ENDTIME=%6
    set TOTALTIME=%7

    SET FINDWHAT=%UBENAME%%UBEVER%  :: letter to find in the file
    SET REPLACEWITH=^<tr^>^<td^> %UBENAME% ^</td^>^<td^> %UBEVER% ^</td^>^<td^> %UBESTAT% ^</td^>^<td^> %RUNDATE% ^</td^>^<td^> %STARTTIME% ^</td^>^<td^> %ENDTIME% ^</td^>^<td^> %TOTALTIME% ^</td^>^</tr^>
    SET FILE=template.html  :: file to look in

    FINDSTR %FINDWHAT% %FILE% >nul
    IF %ERRORLEVEL% EQU 1 GOTO nowork

    MOVE /Y "%FILE%" "%FILE%.bak"
    FOR /F "USEBACKQ tokens=*" %%A IN (`TYPE "%FILE%.bak" ^|FIND /N /I "%FINDWHAT%"`) DO (
      SET LINE=%%A
    )
    FOR /F "tokens=1,2* delims=]" %%S in ("%LINE%") DO SET LINE=%%S  ::read file line by line
        SET /A LINE=%LINE:~1,6%
        SET /A COUNT=1
        FOR /F "USEBACKQ tokens=*" %%A IN (`FIND /V "" ^<"%FILE%.bak"`) DO (
          IF "!COUNT!" NEQ "%LINE%" (
              ECHO %%A>>"%FILE%" :: if the matching string not found, write the line as it is
          ) ELSE (
              ECHO %REPLACEWITH%>>"%FILE%" :: if found, replace the entire line with PROPVAL
          )
          SET /A COUNT+=1
        )
    GOTO end
    :nowork

    :end
)
:sendreport
echo "done"

вывод.txt

R560359C    BA0001  Done    113121  24046   113121  24047
R560902C    BAS0006 Done    113121  24647   113121  45726
R560902C    BAS0005 Done    113121  24647   113121  45155
R560902C    BAS0009 Done    113121  45754   113121  70022

шаблон.html

<html>
<body>
<table>
<tr id='R560902CBAS0009'><td>R093021</td><td>BASJ1TNA</td><td>not_started</td><td>-</td><td>-</td><td>-</td><td>-</td></tr>
<tr id='R6213G04BA0001'><td>R6213G04</td><td>BA0001</td><td>not_started</td><td>-</td><td>-</td><td>-</td><td>-</td></tr>
<tr id='R560359BBA0001'><td>R560359B</td><td>BA0001</td><td>not_started</td><td>-</td><td>-</td><td>-</td><td>-</td></tr>
<tr id='R560902CBAS0006'><td>R560902C</td><td>BAS0006</td><td>not_started</td><td>-</td><td>-</td><td>-</td><td>-</td></tr>
<tr id='R560902CBAS0005'><td>R560902C</td><td>BAS0005</td><td>not_started</td><td>-</td><td>-</td><td>-</td><td>-</td></tr>
<tr id='R560359CBA0001'><td>R560902C</td><td>BAS0009</td><td>not_started</td><td>-</td><td>-</td><td>-</td><td>-</td></tr>
</table>
</body>
</html>

person Osho    schedule 02.05.2013    source источник
comment
Во-первых, вы не можете думать, что комментарии к bat-файлам равносильны комментариям на других языках: если вы поместите одну и ту же строку команды, она будет обработана как ее часть...   -  person kokbira    schedule 02.05.2013
comment
Кроме того, используйте команду паузы, выполните отладку (чтобы обнаружить, где ошибка) такой файл...   -  person kokbira    schedule 02.05.2013
comment
Ну, проблема в FOR /F "USEBACKQ tokens=*" %%A IN (FIND /V ^‹%FILE%.bak) DO (... Пытаюсь понять, что не так...   -  person kokbira    schedule 02.05.2013
comment
FIND /V "" ^<"%FILE%.bak" имеет тот же эффект, что и FIND /V "" "%FILE%.bak"...   -  person kokbira    schedule 02.05.2013
comment
Кроме того, выполняя только FOR /F "USEBACKQ tokens=*" %%A IN (FIND /V %FILE%.bak) DO echo.%%A, он запускается, показывая ошибку внутри цикла for...   -  person kokbira    schedule 02.05.2013
comment
Наконец, помните об использовании ! при использовании SETLOCAL EnableDelayedExpansion. Я думаю дело было в этом...   -  person kokbira    schedule 02.05.2013


Ответы (1)


@ECHO OFF
setlocal
for /F "tokens=1,2,3,4,5,6,7" %%i in (output.txt) do call :process %%i %%j %%k %%l %%m %%n %%o
goto :sendreport

:: procedure to prepare report

:process
    SETLOCAL EnableDelayedExpansion

    set UBENAME=%1
    set UBEVER=%2
    set UBESTAT=%3
    set RUNDATE=%4
    set STARTTIME=%5
    set ENDTIME=%6
    set TOTALTIME=%7

:: letter to find in the file
    SET FINDWHAT=%UBENAME%%UBEVER%
    SET REPLACEWITH=^<tr^>^<td^> %UBENAME% ^</td^>^<td^> %UBEVER% ^</td^>^<td^> %UBESTAT% ^</td^>^<td^> %RUNDATE% ^</td^>^<td^> %STARTTIME% ^</td^>^<td^> %ENDTIME% ^</td^>^<td^> %TOTALTIME% ^</td^>^</tr^>
:: file to look in
    SET FILE=template.html

    FINDSTR %FINDWHAT% %FILE% >nul
    IF %ERRORLEVEL% EQU 1 GOTO nowork

    MOVE /Y "%FILE%" "%FILE%.bak" >nul
    FOR /F "delims=" %%A IN ('TYPE "%FILE%.bak"') DO (
     ECHO "%%A"|FIND /i "%findwhat%" >NUL
     IF ERRORLEVEL 1 (>>"%file%" echo %%A
     ) else (
      >>"%file%" echo !replacewith!
     )
    )
GOTO :eof

:sendreport
echo "done"
GOTO :eof

Это должно сработать - если я понимаю, что вы пытаетесь сделать, обходя дома. Лучше сказать, в чем проблема, а не просить исправить лекарство, которое не работает.

  • Возьмите файл, строка за строкой.
  • Найдите целевую строку
  • если не найдено, просто откопируйте строку
  • если найдено, выплюнуть строку замены.

Хитрость заключается в использовании отложенного расширения, чтобы предотвратить интерпретацию строки замены. С !var! синтаксический анализатор не знает, что переменная содержит перенаправления, поэтому он не возражает. Во время выполнения анализатор уже выполнил свою работу.

person Magoo    schedule 02.05.2013
comment
Хорошо, это более вежливый ответ. Я отказался от своего :) - person kokbira; 02.05.2013
comment
Большое спасибо, это помогло. Я знал это !! разделитель используется во время выполнения, но не знал, что его можно использовать таким образом, и парсер пропускает его. Спасибо, Питер, ты спас меня. - person Osho; 02.05.2013