Не може да се напише html от групов скрипт на Windows с помощта на for цикъл

след като се мъчих в продължение на 2 дни, все още не успях да намеря решение на проблема си с пакетния скрипт на Windows.

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

Каквото и да правя, винаги получавам някаква грешка „‹ се очаква в този момент“, когато се опитам да накарам html тагове към файла. Изглежда пакетният скрипт не харесва html.

Ето моят код:

script.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"

output.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

template.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