Si potrebbe pensare che si possa fare qualcosa come il seguente, ma non funzionerà.
(nmake & call set myError=%%errorlevel%%) | tee output.txt
Il problema sta nel meccanismo con cui i tubi di Windows funzionano. Ogni lato della pipe viene eseguito nella propria shell CMD. Quindi qualsiasi variabile d'ambiente che hai impostato, scomparirà una volta terminato il comando. Anche l'espansione ritardata di% errorlevel% è più complicata a causa del livello extra di analisi e poiché la shell CMD ha un contesto della riga di comando anziché un contesto batch.
Si potrebbe fare qualcosa di simile:
(nmake & call echo %%^^errorlevel%% ^>myError.txt) | tee output.txt
for /f %%A in (myError.txt) do echo nmake returned %%A
del myError.txt
Oppure si potrebbe incorporare l'errorlevel nel output.txt:
(nmake & call echo nmakeReturnCode: %%^^errorlevel%%) | tee output.txt
for /f "tokens=2" %%A in ('findstr /b "nmakeReturnCode:" output.txt') do echo nmake returned %%A
Ma la soluzione più semplice sembra essere
nmake >output.txt
set myError=%errorlevel%
type output.txt
echo nmake returned %myError%
Note - ci sono molte complicazioni quando si lavora con i tubi di Windows. Un buon riferimento è Why does delayed expansion fail when inside a piped block of code?. Raccomando di leggere la domanda e tutte le risposte. La risposta selezionata ha le migliori informazioni, ma le altre risposte aiutano a fornire il contesto.
EDIT 2015-06-02
ho scoperto di recente è possibile utilizzare le macro DOSKEY per memorizzare in modo pulito e recuperare l'ERRORLEVEL da uno (o entrambi) i lati di un tubo, senza ricorrere ad un file temporaneo. Ho avuto l'idea dall'utilizzatore di DosTips Ed Dyreen allo http://www.dostips.com/forum/viewtopic.php?p=41409#p41409. Le macro DOSKEY non possono essere eseguite tramite batch, ma le definizioni persistono dopo l'uscita ENDLOCAL e CMD/C!
Ecco come si dovrebbe utilizzare per l'utente:
(nmake & call doskey /exename=err err=%%^^errorlevel%%) | tee output.txt
for /f "tokens=2 delims==" %%A in ('doskey /m:err') do echo nmake returned %%A
Se si desidera, è possibile aggiungere più un comando alla fine di cancellare la definizione del err "macro" dopo aver recuperato il valore.
doskey /exename=err err=
La soluzione semplice sconfigge il motivo principale per l'utilizzo del tee (uscita simultanea). Anche per la prima soluzione è possibile utilizzare "set/p MY_ERROR =
Qual è l'accordo con 'call set',' call echo' e così via? Non ho mai visto questa sintassi prima. – alecov
@Alek - È un vecchio trucco per ottenere un secondo round di espansione delle variabili dopo l'analisi iniziale. È un'alternativa all'utilizzo dell'espansione ritardata. 'echo! var!' è simile a 'call echo %% var %%'. L'espansione ritardata è in genere preferita, ma ci sono momenti in cui è necessario l'hack CALL. – dbenham