为什么我在处理刚创建的文件时首先获得最后一行?

时间:2012-02-13 17:56:12

标签: batch-file

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

答案 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%