Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Windows 批处理文件:在调用set命令之前,正在set命令中解析的变量_Windows_Batch File_Cmd_Errorlevel - Fatal编程技术网

Windows 批处理文件:在调用set命令之前,正在set命令中解析的变量

Windows 批处理文件:在调用set命令之前,正在set命令中解析的变量,windows,batch-file,cmd,errorlevel,Windows,Batch File,Cmd,Errorlevel,我想创建一个日志系统:在获取日志的命令后添加%Logger%。只有错误输出,错误计数 当我调用%Logger%时,我想让它从上一个程序中获取%Errorlevel%(例如:当我运行del numl%Logger%时,我想从del numl中获取%Errorlevel%) 我有以下代码: Set Logger=2^>CurrentError.log^>%LogName%^>和Set Err=%Errorlevel%^&(对于/f“tokens=*”%%a in(CurrentError.log)d

我想创建一个日志系统:在获取日志的命令后添加
%Logger%
。只有错误输出,错误计数

当我调用
%Logger%
时,我想让它从上一个程序中获取
%Errorlevel%
(例如:当我运行
del numl%Logger%
时,我想从
del numl
中获取
%Errorlevel%
) 我有以下代码:

Set Logger=2^>CurrentError.log^>%LogName%^>和Set Err=%Errorlevel%^&(对于/f“tokens=*”%%a in(CurrentError.log)do(echo[EROR]%a)^>>ErrorConsole.log)^&(如果存在ErrorConsole.log类型ErrorConsole.log)^和键入CurrentError.log^>%LogName%^&(如果存在ErrorConsole.log del.log)^&(如果%Err%GTR 0 set/a ErrNum=ErrNum+1^>num^&echo%ESC%[33m[警告]发生错误,安装将继续。%ESC%[91m)
当我运行代码时,
%Errorlevel%
已经解析为它在
%Logger%
中的值

如果我使用
%%Errorlevel%%
%Errorlevel%
不会被解析,但是当我调用
%Logger%
时,
%Errorlevel%
是一个字符串,不会被解析为它的值(
%Errorlevel%
仍然
%Errorlevel%
,而不是0或1)


ESC
的值可能不显示,尽管它确实存在

延迟扩展用作
记录器
变量,以code作为值,与命令在同一行上使用。延迟扩展变量使用语法
!name!
,而不是
%name%

^
在行尾使用以继续下一行。
设置记录器=…
在多行上查看更容易

!如果在字符串中,则根据需要进行转义,即
^!
,否则
^!


set/a ErrNum=ErrNum+1
更改为等效的
set/a“ErrNum+=1”

为什么所有内容都转义并放在一行?感谢您的回复。只有一行,因为当我调用cmd并转义以设置变量中的特殊字符时,它不会执行第二行变量。为什么您要将变量用于函数而不是函数?为什么不在命令末尾添加
>log.txt
这样,日志就不会包含错误,如果你2>log.log,就没有输出。因此,你需要在命令和硬编辑的每一个结尾添加类型和大量内容。因此,我将它们设置为一个变量,以便于编辑和优化批处理大小。我的即时反应是为什么!不管怎样,你在计算变量之前使用变量的值,你想要的是它的变量self,因此请尝试使用
%%Errorlevel%%
,您也可以使用
%%LogName%%
%%ESC%%
ESC
的值从编辑视图和预览中复制,但从后期视图中不复制。
ESC
的值可能需要插入编辑器粘贴的代码中(如果不存在)。ESC是为颜色设置它非常感谢您的帮助。您忘记了将
()
添加到
if
上,而+
if
仅在第一个
if
为真时才会执行。
@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