我有一个批处理脚本,它解析XML文件并使用提取的数据(提取的文件)创建一个文件。
在同一个批处理脚本中,我然后使用解压缩的文件创建一个带有SQL命令的文件(sql文件)。
当我开始创建SQL文件时,我首先从提取的文件中获取最后一条记录(行),并正确创建语句。
如何停止获取最后一条记录:buildsql?
@echo off
echo Beginning parsing of XML files for pagecount and docid extraction.
echo Processing...
SET /A counter = 0
FOR /F %%i IN (CDIZeroPage.TXT) DO (
IF EXIST %%i (
FOR /F "tokens=12 delims==" %%h IN (%%i) DO (CALL :pagestring %%h)
FOR /F "tokens=8 delims==" %%g IN (%%i) DO (CALL :docidstring %%g)
)
)
goto buildsql
:pagestring
echo %1 >> C:\Richtemp\PagesandDocs.txt
CALL set page=%1
goto :eof
:docidstring
echo %1 >> C:\Richtemp\PagesandDocs.txt
CALL SET docid=%1
SET /A counter+=1
goto :eof
:buildsql
echo End extracting pagecount and docid.
echo Number of files processed %counter%
echo
echo Begin building SQL
echo Processing...
SET /A counter=0
SET /A countbytwo=0
FOR /F %%i IN (PagesandDocs.txt) DO (
CALL :subroutine %%i
SET /A counter+=1
)
goto endofscript
:subroutine
SET /A countbytwo+=1
IF %countbytwo%==1 (
FOR /F "DELIMS=" %%G IN ('ECHO %1') DO (SET page=%%~G)
echo Update documents set pagecount = %page% >> C:\Richtemp\Update.txt
)
IF %countbytwo%==2 (
FOR /F "DELIMS=" %%G IN ('ECHO %1') DO (SET docid=%%~G)
echo where uniqueid = %docid% ^; >> C:\Richtemp\Update.txt
SET /A countbytwo=0
)
goto :eof
:endofscript
SET /A counter/=2
echo End building sql, number of scripts built %counter%
:eof
答案 0 :(得分:1)
你的问题在这里:
:docidstring
echo %1 >> C:\Richtemp\PagesandDocs.txt
CALL SET docid=%1
SET /A counter+=1
goto :eof
在上面的代码中,您设置了docid。在第一阶段处理结束时,它会将最后一行存储在docid
中。然后你打电话给buildsql
,问题就在这里:
IF %countbytwo%==2 (
FOR /F "DELIMS=" %%G IN ('ECHO %1') DO (SET docid=%%~G)
echo where uniqueid = %docid% ^; >> C:\Richtemp\Update.txt
SET /A countbytwo=0
)
您会认为echo
将使用您刚设置的docid
,不幸的是,它不是。它会在扩展之前被替换为docid
的旧值...在第一次调用时,它将代表您的最后一行。 page
变量
您可能可以使用延迟扩展来解决此问题,但您的代码看起来过于复杂。你究竟想要实现什么目标?如果打算从一行中的位置12,8中提取项目并构建如下的查询表达式:
Update documents set pagecount = #12 where where uniqueid = #8;
它将无法正常工作,因为您首先将所有#12,然后#8卸载到文件中。
也许这对你有用吗?
setlocal
FOR /F %%i IN (CDIZeroPage.TXT) DO (
FOR /F "tokens=8-12 delims==" %%j IN (%%i) do (
ECHO Update documents set pagecount = %%n where where uniqueid = %%j ^; >>update.txt
SET /A counter+=1
)
)
echo End building sql, number of scripts built %counter%