Пакетный файл: переменная разрешается в команде set, прежде чем я ее назову - PullRequest
1 голос
/ 25 мая 2020

Я хочу создать систему журналов: добавьте %Logger% после команды для получения журналов. Только вывод ошибок, количество ошибок.

Я хочу go получить %Errorlevel% из предыдущей программы, когда я вызываю %Logger% (например: я хочу получить %Errorlevel% из del nul, когда я запустить del nul %Logger%) У меня есть этот код:

Set Logger=2^>CurrentError.log ^>^>%LogName% ^& set Err=%Errorlevel% ^& (for /f "tokens=*" %%a in (CurrentError.log) do (echo [EROR] %%a) ^>^> ErrorConsole.log) ^& (if exist ErrorConsole.log type ErrorConsole.log) ^& type CurrentError.log ^>^>%LogName% ^& (if exist ErrorConsole.log del ErrorConsole.log) ^& (if %Err% GTR 0 set /a ErrNum=ErrNum+1 ^>nul ^& echo %ESC%[33m[WARN] An error has occurred, installation will continue.%ESC%[91m)

Когда я запускаю код, %Errorlevel% уже разрешено, так как это значение в %Logger%.

Если я использую %%Errorlevel%%, %Errorlevel% не решается, но когда я вызываю %Logger%, %Errorlevel% - это строка, не разрешаемая как значение (%Errorlevel% все еще %Errorlevel%, а не 0 или 1)

1 Ответ

0 голосов
/ 26 мая 2020
@echo off
setlocal enabledelayedexpansion

set "ESC="
set "ErrNum=0"
set "LogName=Stdout.log"

set Logger=2^>CurrentError.log ^>^> "%LogName%" ^&^
 set "Err=^!Errorlevel^!" ^&^
 (for /f "tokens=*" %%a in (CurrentError.log) do echo [EROR] %%a) ^>^> ErrorConsole.log ^&^
 (if exist ErrorConsole.log type ErrorConsole.log) ^&^
 type CurrentError.log ^>^> "%LogName%" ^&^
 (if exist ErrorConsole.log del ErrorConsole.log) ^&^
 (if ^^!Err^^! NEQ 0 set /a "ErrNum+=1" ^& echo %ESC%[33m[WARN] An error has occurred, installation will continue.%ESC%[91m)

del nul %Logger%
pause

Значение ESC может не отображаться, хотя оно существует.

Отложенное раскрытие, используемое как переменная logger, с кодом в качестве значения, которое должно использоваться в той же строке, что и команда. В переменных с отложенным раскрытием используется синтаксис !name! вместо %name%.

^, используемый в конце строк для перехода к следующей строке. set Logger=... проще просматривать на нескольких строках.

! при необходимости экранировано, т.е. ^! если внутри строки, иначе ^^!.

Изменено set /a ErrNum=ErrNum+1 на эквивалент set /a "ErrNum+=1".

...