簡體   English   中英

無法使用for循環從Windows批處理腳本編寫html

[英]Unable to write html from windows batch script using for loop

經過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>
@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! ,解析器不知道變量包含重定向,因此它不反對。 在執行時,解析器已經完成了它的工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM