Batch file 为什么在处理刚创建的文件时,我会先得到最后一行?

Batch file 为什么在处理刚创建的文件时,我会先得到最后一行?,batch-file,Batch File,我有一个批处理脚本,它解析XML文件并使用提取的数据创建一个文件(提取的文件) 在同一批脚本中,我使用提取的文件创建一个包含SQL命令的文件(SQL文件) 当我开始创建SQL文件时,我首先从提取的文件中获取最后一条记录(行),并且正确地创建了语句 如何停止在buildsql中首先获取最后一条记录 @echo off echo Beginning parsing of XML files for pagecount and docid extraction. echo Processing...

我有一个批处理脚本,它解析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
你的问题是:

:docidstring
  echo %1 >> C:\Richtemp\PagesandDocs.txt
  CALL SET docid=%1
  SET /A counter+=1
goto :eof
 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
  )
在上面的代码中,您设置了docid。在处理的第一阶段结束时,它将最后一行存储在
docid
中。然后调用
buildsql
,问题是:

:docidstring
  echo %1 >> C:\Richtemp\PagesandDocs.txt
  CALL SET docid=%1
  SET /A counter+=1
goto :eof
 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%

是的,太复杂了。我精简了它,同时写下了这两个文件,解决了我的问题。我只是无法确定为什么最后一条记录是在这个版本中首先写入的。谢谢你的解释,这将有助于我写剧本。