批处理文件:在我调用它之前,在 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"