2012-06-27 55 views
3

我想在批处理文件中使用for循环交替地打印2个单独的txt文件的每一行,我尝试使用AND,但在cmd.exe中给出:“AND在此时是意外的”批量。有任何想法吗?For循环批处理中的多个条件?

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 

) 

回答

2

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

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

任一文件和/或不同行数中的空行都会导致当前写入的问题。此外,OP需要注意的是,SET/P正在读取的文件中没有行可能会超过1021个字节。 – dbenham

+0

你能解释一下set/p lineFromFile2 =是否应该完成。我在'='符号的右侧看不到promptString。 @dbenham你如何建议这可以修复? – jerryh91

+0

set/p行从stdin读取一行,并将该值赋给变量。由于stdin已被重定向到您的文件,它从文件读取一行。不需要提示。就“修复”代码而言,这取决于需求是什么。一行可以超过1021个字符(字节)的长度?两行文件中的任何一行都可以是空白的?如果两个文件都可以超过1021字符集/ p长度限制,并且两个文件都可以有空行,那么任何批处理解决方案都会很慢。 – dbenham

0

我相信这和批处理解决方案一样强大。

  • 它可以处理两个文件中的空行
  • 它可以读取高达约8K字节,每行
  • 线中的文件数量并不一定要配合
  • 一个行可以与开始任何字符(避免FOR/F EOL问题)
  • (而延迟扩充被启用避免扩大一个FOR 变量的问题)一个行可以包含!而不会损坏
  • 行可以是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 

好得多使用jeb's approach如果该解决方案的限制是不与您的文件值得关注。它目前有以下限制,可能具有相当小的修改被删除:

  • 文件必须具有相同的行数
  • 文件不得有空白行
  • 文件1不能包含!字符
  • 没有在File1中的行可以以;

开始此外,在读取SET/P limi固有的File2时还有以下限制tations

  • 线必须是Windows的风格,在回车符换行
  • 结束
  • 线不能超过1021个字符(字节),不包括行终止
  • 控制字符将被剥离的每一行的末尾

更好的解决方案是使用批次以外的东西。有许多可能性:VBS,JScript,PowerShell,perl ...列表继续。