!errorlevel! を使用しようとしています。ループ内の条件として。呼び出しでエラー レベルを渡し、再び findstr を使用してエラー レベルを設定しようとしましたが、条件が変化していません。
setlocal EnableDelayedExpansion
for /F %%i in (%Newzips.lst%) do (
echo unzipping %%i >> test.log
wzunzip -o %%i
call :startloop
)
exit /B
:startloop
dir /b *.dat > %Stagedat.lst%
for /F %%l in (%Stagedat.lst%) do (
dir /b E:\NOMADD_FILES\AV\*.dat > %AVdat.lst%
findstr /i /c %%l %AVdat.lst%
echo top error level - !errorlevel!
call :checkdup %%l !errorlevel!
)
exit /B
:checkdup
if !errorlevel! == 0 (
dir /b E:\NOMADD_FILES\AV\*.dat > %AVdat.lst%
findstr /i %1 %AVdat.lst% >> test.log
echo found match so sleep e >> test.log
echo error level - !errorlevel! >> test.log
sleep 3
echo duplicate in AVdat.lst >> test.log
call :checkdup %1 !errorlevel!
)
if !errorlevel! == 1 (
echo copying file %2 >> test.log
move /Y %1 E:\NOMADD_FILES\AV
sleep 5
dir /b E:\NOMADD_FILES\AV\*.dat > %AVdat.lst%
echo moveing AVdat.lst >> test.log
echo error level - !errorlevel! >> test.log
type %AVdat.lst% >> test.log
)
exit /B
:end
つまり、:checkdup に到達して findstr を再度実行すると、!errorlevel! が実行されます。は 1 に更新されていますが、まだ上部の if ステートメント内にとどまっています。
これはログのサンプルです。
top error level - 0
bcs3_ammo_inv_updates.dat
found match so sleep e
error level - 0
duplicate in AVdat.lst
bcs3_ammo_inv_updates.dat
found match so sleep e
error level - 0
duplicate in AVdat.lst
bcs3_ammo_inv_updates.dat
found match so sleep e
error level - 0
duplicate in AVdat.lst
found match so sleep e
error level - 1
duplicate in AVdat.lst
found match so sleep e
error level - 1
duplicate in AVdat.lst
found match so sleep e
error level - 1
したがって、エラー レベルは 1 に設定されていますが、if !errorlevel! でスタックしています。== 0 状態。他のチェックに進み、for ループを続行する必要があります。私はこれに数日間立ち往生しており、さまざまな組み合わせを試して機能させています。
ありがとう