我相信这和批处理解决方案一样强大。
- 它可以处理两个文件中的空行
- 它可以读取高达约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 ...列表继续。
任一文件和/或不同行数中的空行都会导致当前写入的问题。此外,OP需要注意的是,SET/P正在读取的文件中没有行可能会超过1021个字节。 – dbenham
你能解释一下set/p lineFromFile2 =是否应该完成。我在'='符号的右侧看不到promptString。 @dbenham你如何建议这可以修复? – jerryh91
set/p行从stdin读取一行,并将该值赋给变量。由于stdin已被重定向到您的文件,它从文件读取一行。不需要提示。就“修复”代码而言,这取决于需求是什么。一行可以超过1021个字符(字节)的长度?两行文件中的任何一行都可以是空白的?如果两个文件都可以超过1021字符集/ p长度限制,并且两个文件都可以有空行,那么任何批处理解决方案都会很慢。 – dbenham