@ECHO OFF
SETLOCAL
for %%i in (var return1 return2 bat1err) do set "%%i="
FOR /f %%i IN ('call first') DO SET var=%%i
FOR /f "tokens=1,2" %%i IN ("%var%") DO set return1=%%i&set return2=%%j
Should set return1 and return2 to your two values BUT the value of ERRORLEVEL generated by FIRST.bat can't be retrieved.
In your original code, the file t would be generated in any case - and would be zero-length if there was no output from first.bat. I'm confused by your action in only deleting t if no-error-occurs....
So - what we'd really need to do is to change FIRST.bat a little.
If first.bat does not use SETLOCAL, then
set bat1err=%errorlevel%
at an appropriate point would return bat1err set to the errorlevel.
If first.bat does use SETLOCAL, then life gets a little more complicated
set bat1err=%errorlevel%
at an appropriate point would set bat1err in the same way, but you would need to use
ENDLOCAL&set bat1err=%bat1err%
before exiting. This is a parsing trick, cashing in on the way in which the line is first parsed, then executed. What happens is that the line is actually executed as
endlocal&set bat1err=22
or whatever, setting BAT1ERR within the context of the calling, not the called batch.
Another way would be to include %errorlevel% in your output, and simply change the analysis to
FOR /f "tokens=1,2,3" %%i IN ("%var%") DO set bat1err=%%i&return1=%%j&set return2=%%k
OR, depending on quite what the output of first.bat is, you may be able to do it a third way:
If first.bat produces no output for error but a line of output for success,
FOR /f %%i IN ('call first') DO SET var=%%i
if defined var (
FOR /f "tokens=1,2" %%i IN ("%var%") DO set return1=%%i&set return2=%%j
) else (echo Error occurred)
and again return, return2 and var can be analysed with IF DEFINED to make decisions.
That really depends on information we don't have.