我想在批处理文件中使用for循环交替打印2个单独的txt文件的每一行,我尝试使用AND但是当我运行时,在cmd.exe中给出了“此时出现意外的AND”我的批次。有什么想法吗?
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
)
答案 0 :(得分: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!
)
)
答案 1 :(得分:0)
我相信这和批处理解决方案一样强大。
!
而不会被破坏(避免扩展FOR的问题
变量,同时启用延迟扩展)但是这个解决方案在读取大文件时会逐渐变慢,因为它必须从头开始为每一行重新扫描第二个文件。
@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要好得多。它目前有以下限制,可以通过相当小的修改删除:
!
字符;
此外,在读取SET / P限制所固有的File2时,它具有以下限制
更好的解决方案是使用批量以外的东西。有很多可能性:VBS,JScript,PowerShell,perl ......列表一直在继续。