Batch file 为什么在处理刚创建的文件时,我会先得到最后一行?
我有一个批处理脚本,它解析XML文件并使用提取的数据创建一个文件(提取的文件) 在同一批脚本中,我使用提取的文件创建一个包含SQL命令的文件(SQL文件) 当我开始创建SQL文件时,我首先从提取的文件中获取最后一条记录(行),并且正确地创建了语句 如何停止在buildsql中首先获取最后一条记录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...
@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%
是的,太复杂了。我精简了它,同时写下了这两个文件,解决了我的问题。我只是无法确定为什么最后一条记录是在这个版本中首先写入的。谢谢你的解释,这将有助于我写剧本。