2012-02-13 36 views
0

我有一个批处理脚本,它解析一个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 

回答

1

你的问题是在这里:

:docidstring 
    echo %1 >> C:\Richtemp\PagesandDocs.txt 
    CALL SET docid=%1 
    SET /A counter+=1 
goto :eof 
在上面的代码

,您可以设置文档ID。在处理的第一阶段结束时,它将在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% 
+0

是的,它太复杂了。我缩小了它,并立即写了两个文件,这“解决了”我的问题。我只是无法确定为什么最后的记录是在这个版本中首先写入的。感谢您的解释,它会帮助我编写脚本。 – 2012-02-15 13:18:32

相关问题