3

バッチファイルで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

 )
4

2 に答える 2

2

のようなキーワードはありませんAND。通常、これは 2 つの FOR ループでは解決できません。
しかし、でファイルを読み取る別の方法がありますset /p

setlocal EnableDelayedExpansion
<file2.txt (
  FOR /F "delims=" %%A in (file1.txt) DO (
    set /p lineFromFile2=
    echo file1=%%A, file2=!lineFromFile2!
  )
)
于 2012-06-27T17:01:29.647 に答える
0

これは、バッチ ソリューションと同じくらい堅牢だと思います。

  • 両方のファイルの空白行を処理します
  • 各行で最大約 8k バイトを読み取ることができます。
  • ファイルの行数は一致する必要はありません
  • 行は任意の文字で開始できます (FOR /F EOL の問題を回避します)
  • 行は!破損せずに含めることができます (遅延展開が有効になっている間に FOR 変数を展開する問題を回避します)
  • 行は、Unix または Windows スタイルのいずれかです。
  • 制御文字は行末から削除されません

ただし、このソリューションは、行ごとに最初から 2 番目のファイルを再スキャンする必要があるため、大きなファイルを読み取るにつれて次第に遅くなります。

@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 のアプローチを使用する方がはるかに優れています。現在、かなり小さな変更で取り除くことができる次の制限があります。

  • ファイルの行数は同じでなければなりません
  • ファイルに空白行があってはなりません
  • !File1 に文字を含めることはできません
  • File1 のどの行も開始できません;

さらに、SET /P の制限に固有の File2 を読み取るときに、次の制限があります。

  • 行は、carriageReturn lineFeed で終わる Windows スタイルでなければなりません
  • 行末記号を除いて、行は 1021 文字 (バイト) を超えることはできません
  • 制御文字は各行の終わりから削除されます

さらに良い解決策は、バッチ以外のものを使用することです。多くの可能性があります: VBS、JScript、PowerShell、perl ... リストは延々と続きます。

于 2012-06-27T20:42:40.230 に答える