Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Loops "这个时候出人意料,_Loops_Batch File_For Loop - Fatal编程技术网

Loops "这个时候出人意料,

Loops "这个时候出人意料,,loops,batch-file,for-loop,Loops,Batch File,For Loop,我有一个代码,它应该分组读取一个大的文本文件。我将问题部分分离在一个更小的代码中,该代码只包含发生此问题的for循环。代码的工作方式是读取100行,然后跳出for循环,返回,跳过100行,读取下一个100行,然后跳过200行,读取下一个100行…等等。但是for循环中的选项似乎有问题。这给了我一个意想不到的结果。就像标题中一样 setlocal enabledelayedexpansion set skipline=0 :loop FOR /F "skip=%skipline%" %%G IN

我有一个代码,它应该分组读取一个大的文本文件。我将问题部分分离在一个更小的代码中,该代码只包含发生此问题的for循环。代码的工作方式是读取100行,然后跳出for循环,返回,跳过100行,读取下一个100行,然后跳过200行,读取下一个100行…等等。但是for循环中的选项似乎有问题。这给了我一个意想不到的结果。就像标题中一样

setlocal enabledelayedexpansion
set  skipline=0
:loop
FOR /F "skip=%skipline%" %%G IN (doc1.txt) DO (
if NOT !line! GTR 100 (
    set /a line+=1
    echo line!line! %%G
) else goto :endloop
)
:endloop
set /a line=0
set /a skipline+=100
pause
goto :loop
我非常感谢您的回答,因为在解决此问题之前,我无法继续我的工作。

for/f将不允许您跳过0行。请尝试类似的方法

延迟扩展 设置Skipline=0 :循环 如果%skipLines%==0,则设置跳过=否则设置跳过=跳过=%skipLines% 设置/a行=0 对于doc1.txt中的/F%skip%delims=%%G DO 设置/a行+=1 回音线!回音线!%%G if!line!EQU 100转到:endloop ||转到结束文件 :endloop 集/a Skipline+=100 暂停 转到:循环 :endFile 已处理回显文件 根据要跳过的行数,完整skip子句存储在变量中。如果%skipLines%为0,则不必使用skip子句

在for循环的末尾有一个条件执行运算符,用于测试文件是否已被完全处理。当for/f无法从文件中读取任何内容时,我们将跳过所有行,它将引发errorlevel,并执行goto endFile

在任何情况下,您都应该注意for/f将始终将文件中的所有数据加载到内存中。skip子句仅指示从何处开始执行do子句中的代码。

for/f将不允许您跳过0行。请尝试类似的方法

延迟扩展 设置Skipline=0 :循环 如果%skipLines%==0,则设置跳过=否则设置跳过=跳过=%skipLines% 设置/a行=0 对于doc1.txt中的/F%skip%delims=%%G DO 设置/a行+=1 回音线!回音线!%%G if!line!EQU 100转到:endloop ||转到结束文件 :endloop 集/a Skipline+=100 暂停 转到:循环 :endFile 已处理回显文件 根据要跳过的行数,完整skip子句存储在变量中。如果%skipLines%为0,则不必使用skip子句

在for循环的末尾有一个条件执行运算符,用于测试文件是否已被完全处理。当for/f无法从文件中读取任何内容时,我们将跳过所有行,它将引发errorlevel,并执行goto endFile


在任何情况下,您都应该注意到for/f将始终将文件中的所有数据加载到内存中。skip子句仅指示从何处开始执行do子句中的代码。

正如MC ND在其回答中指出的,问题是skip for选项不能跳过0行。解决代码中这一点的方法如下:

setlocal enabledelayedexpansion
set skipline=0
set "skip="
:loop
   set line=0
   FOR /F "%skip%" %%G IN (doc1.txt) DO (
      set /a line+=1
      echo line!line! %%G
      if !line! EQU 100 goto :endloop
   )
   :endloop
   set /a skipline+=100
   set "skip=skip=%skipline%"
   pause
goto :loop
但是,您可以使用一种更简单的方法,将文件重定向到子例程中,这样您就可以通过放置在比您的方法运行速度更快的FOR/L循环中的set/p命令来读取那里的行。当到达文件结尾时,将errorlevel设置为1,因此这是结束进程的一种简单方法

setlocal EnableDelayedExpansion

call :ProcessFile < doc1.txt
goto :EOF


:ProcessFile
   for /L %%i in (1,1,100) do (
      set /P "line="
      if errorlevel 1 goto endFile
      echo line%%i !line!
   )
   pause
goto ProcessFile
:endFile
exit /B

正如MC ND在其回答中指出的,问题在于skip FOR option不能跳过0行。解决代码中这一点的方法如下:

setlocal enabledelayedexpansion
set skipline=0
set "skip="
:loop
   set line=0
   FOR /F "%skip%" %%G IN (doc1.txt) DO (
      set /a line+=1
      echo line!line! %%G
      if !line! EQU 100 goto :endloop
   )
   :endloop
   set /a skipline+=100
   set "skip=skip=%skipline%"
   pause
goto :loop
但是,您可以使用一种更简单的方法,将文件重定向到子例程中,这样您就可以通过放置在比您的方法运行速度更快的FOR/L循环中的set/p命令来读取那里的行。当到达文件结尾时,将errorlevel设置为1,因此这是结束进程的一种简单方法

setlocal EnableDelayedExpansion

call :ProcessFile < doc1.txt
goto :EOF


:ProcessFile
   for /L %%i in (1,1,100) do (
      set /P "line="
      if errorlevel 1 goto endFile
      echo line%%i !line!
   )
   pause
goto ProcessFile
:endFile
exit /B

我喜欢子程序重定向。但是如果输入文件包含任何空行,set/p行读取和errorlevel检查中存在问题。我喜欢子程序重定向。但是如果输入文件包含任何空行,set/p行读取和errorlevel检查中存在问题。