[英]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.