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
Batch file 循环批处理中的多个条件?_Batch File_For Loop_Line_Cmd - Fatal编程技术网

Batch file 循环批处理中的多个条件?

Batch file 循环批处理中的多个条件?,batch-file,for-loop,line,cmd,Batch File,For Loop,Line,Cmd,我想在批处理文件中交替使用for循环打印每行2个单独的txt文件,我尝试使用AND,但在运行批处理时,cmd.exe中给出了“此时出乎意料”。有什么想法吗 FOR /F "tokens=*" %%F in (!logPath!) AND for /f "tokens=*" %%H in (%%refLogPath) DO ( REM print each line of log file and refLog file sequentially echo %%F echo %

我想在批处理文件中交替使用for循环打印每行2个单独的txt文件,我尝试使用AND,但在运行批处理时,cmd.exe中给出了“此时出乎意料”。有什么想法吗

 FOR /F "tokens=*" %%F in (!logPath!) AND for /f "tokens=*" %%H in (%%refLogPath) DO ( 

  REM print each line of log file and refLog file sequentially 
  echo %%F
  echo %%H
  REM set logLine=%%F
  REM check 'each line' of log file against ENG-REF.log

 )

没有像
这样的关键字,通常你不能用两个FOR循环来解决这个问题。
但是有另一种方法可以使用
set/p
读取文件

setlocal EnableDelayedExpansion
<file2.txt (
  FOR /F "delims=" %%A in (file1.txt) DO (
    set /p lineFromFile2=
    echo file1=%%A, file2=!lineFromFile2!
  )
)
setlocal EnableDelayedExpansion

我相信这是一个批处理解决方案可以得到的最健壮的解决方案

  • 它处理两个文件中的空行
  • 它每行最多可以读取大约8k字节
  • 文件中的行数不必匹配
  • 行可以以任何字符开头(避免FOR/F下线问题)
  • 一行可以包含
    不会损坏(避免了扩展
    启用延迟扩展时的变量)
  • 行可以是Unix或Windows样式
  • 控制字符不会从行尾剥离
但是这个解决方案在读取一个大文件时会变得越来越慢,因为它必须为每一行从头重新扫描第二个文件

@echo off
setlocal disableDelayedExpansion
set "file1=file1.txt"
set "file2=file2.txt"
for /f %%N in ('find /c /v "" ^<"%file2%"') do set file2Cnt=%%N
findstr /n "^" "%file1%" >"%file1%.tmp"
findstr /n "^" "%file2%" >"%file2%.tmp"
set "skip=0"
set "skipStr="
for /f "usebackq delims=" %%A in ("%file1%.tmp") do (
  set "ln1=%%A"
  call :readFile2
  set /a "skip+=1"
)
if %file2Cnt% gtr %skip% (
  for /f "usebackq skip=%skip% delims=" %%B in ("%file2%.tmp") do (
    set "ln2=%%B"
    setlocal enableDelayedExpansion
    set "ln2=!ln2:*:=!"
    (echo()
    (echo(!ln2!)
  )
)
del "%file1%.tmp" 2>nul
del "%file2%.tmp" 2>nul
exit /b

:readFile2
if %skip% gtr 0 set "skipStr=skip=%skip% "
if %file2Cnt% gtr %skip% (
  for /f "usebackq %skipStr%delims=" %%B in ("%file2%.tmp") do (
    set "ln2=%%B"
    goto :break
  )
) else set "ln2="
:break
setlocal enableDelayedExpansion
set "ln1=!ln1:*:=!"
if defined ln2 set "ln2=!ln2:*:=!"
(echo(!ln1!)
(echo(!ln2!)
exit /b
@echo关闭
setlocal disableDelayedExpansion
设置“file1=file1.txt”
设置“file2=file2.txt”

对于/f%%N in('查找/c/v“”^文件中的空行和/或不同的行数将导致当前写入的问题。OP还需要注意,SET/P正在读取的文件中的任何行都不能超过1021字节。能否解释SET/P lineFromFile2=应该完成的任务。我在“=”符号右侧没有看到提示字符串。@dbenham您有何建议t这是否可以修复?set/p行从stdin中读取一行,并将值分配给变量。由于stdin已重定向到您的文件,它从文件中读取一行。无需提示。至于“修复”代码,则取决于要求。一行是否可以超过1021个字符(字节)长度?两个文件中的一行可以是空白的吗?如果两个文件都可以超过1021字符集/p长度限制,并且都可以有空白行,那么任何批处理解决方案都会非常慢。@jerryh91-此解决方案还有其他限制。我发布了一个更健壮但速度较慢的替代方案。在这里,我详细比较了two技术。我在解决方案中使用的一些技术可以用于此解决方案,以消除此处的一些限制。