批处理文件:在我调用它之前,在 set 命令中解析变量
Batch File: Variable being resolved in set command, before I call it
我想创建一个日志系统:在获取日志的命令后添加%Logger%
。只有错误输出,错误计数。
我希望它在我调用 %Logger%
时从之前的程序中获取 %Errorlevel%
(例如:当我 运行 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)
@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"
。
我想创建一个日志系统:在获取日志的命令后添加%Logger%
。只有错误输出,错误计数。
我希望它在我调用 %Logger%
时从之前的程序中获取 %Errorlevel%
(例如:当我 运行 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)
@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"
。