Batch file CMD命令行:一个命令加上ERRORLEVEL直接输出到TXT?

Batch file CMD命令行:一个命令加上ERRORLEVEL直接输出到TXT?,batch-file,cmd,output,errorlevel,Batch File,Cmd,Output,Errorlevel,命令行: 一个CMD命令,一个命令行,无BAT文件 是否有机会将ERRORLEVEL直接写入TXT文件 我试过了,但失败了 我不想每次都创建和保存BAT文件 我更喜欢更简单的方法:CMD单命令加上在一个TXT文件中导出ERRORLEVEL,全部放在一个命令行中 汤米通常的第一个想法是失败的 (commandToExecute)和>“file.txt”回显%errorlevel% 问题是完整的命令行被解析然后执行。在解析阶段,在开始执行命令之前,将从命令中删除所有变量读取操作,并将其替换为存储在

命令行: 一个CMD命令,一个命令行,无BAT文件

是否有机会将ERRORLEVEL直接写入TXT文件

我试过了,但失败了


我不想每次都创建和保存BAT文件

我更喜欢更简单的方法:CMD单命令加上在一个TXT文件中导出ERRORLEVEL,全部放在一个命令行中


汤米

通常的第一个想法是失败的

(commandToExecute)和>“file.txt”回显%errorlevel%
问题是完整的命令行被解析然后执行。在解析阶段,在开始执行命令之前,将从命令中删除所有变量读取操作,并将其替换为存储在变量中的值

这意味着单行无法更改变量并检索更改后的值,因为执行的命令中没有任何读取操作

注意:虽然不是这种情况,但这种解析/替换行为在读取时会影响整行,也会影响块内的所有行,即括号中的所有行。当执行到达一个代码块时,读取该块中的所有行,替换块内的所有变量读取操作,然后开始执行生成的命令

实际执行的命令是(执行前supossing errorlevel为0)

(commandToExecute)&>“file.txt”echo 0
通常的处理方法是启用延迟扩展。这允许您将用于访问变量的语法从
%var%
更改为
!瓦尔。这向解析器指示变量/值替换必须延迟到执行命令时,而不是在解析行时。这是通过
setlocalenabledelayedexpansion
命令完成的

但是,此命令在命令行中无效,仅对批处理文件有效。在命令行中,需要使用
/v
开关启动
cmd
实例以启用延迟扩展。如果用延迟扩展启动
cmd
实例,则可以使用

(commandToExecute)&>“file.txt”echo!错误等级!
但启用延迟扩展后,
会成为一个问题,因为解析器会将其视为变量读取请求的一部分

你还有别的选择。您可以以在解析时不替换变量的方式编写命令,然后在执行时强制对命令进行新的解析

(commandToExecute)和>“file.txt”调用echo%^errorlevel%
使用
^
时,变量无法识别,命令被解析并按如下方式执行

(commandToExecute)&>“file.txt”调用echo%errorlevel%
然后,当执行
call
命令时,将调用一个新的解析阶段,然后在执行第一个命令且
errorlevel
发生更改后,替换行中的变量,并将正确的值发送到文件

已编辑以适应评论-只是测试会话(抱歉,西班牙语区域设置)


这一通常的第一个想法将失败

(commandToExecute)和>“file.txt”回显%errorlevel%
问题是完整的命令行被解析然后执行。在解析阶段,在开始执行命令之前,将从命令中删除所有变量读取操作,并将其替换为存储在变量中的值

这意味着单行无法更改变量并检索更改后的值,因为执行的命令中没有任何读取操作

注意:虽然不是这种情况,但这种解析/替换行为在读取时会影响整行,也会影响块内的所有行,即括号中的所有行。当执行到达一个代码块时,读取该块中的所有行,替换块内的所有变量读取操作,然后开始执行生成的命令

实际执行的命令是(执行前supossing errorlevel为0)

(commandToExecute)&>“file.txt”echo 0
通常的处理方法是启用延迟扩展。这允许您将用于访问变量的语法从
%var%
更改为
!瓦尔。这向解析器指示变量/值替换必须延迟到执行命令时,而不是在解析行时。这是通过
setlocalenabledelayedexpansion
命令完成的

但是,此命令在命令行中无效,仅对批处理文件有效。在命令行中,需要使用
/v
开关启动
cmd
实例以启用延迟扩展。如果用延迟扩展启动
cmd
实例,则可以使用

(commandToExecute)&>“file.txt”echo!错误等级!
但启用延迟扩展后,
会成为一个问题,因为解析器会将其视为变量读取请求的一部分

你还有别的选择。您可以以在解析时不替换变量的方式编写命令,然后在执行时强制对命令进行新的解析

(commandToExecute)和>“file.txt”调用echo%^errorlevel%
使用
^
时,变量无法识别,命令被解析并按如下方式执行

(commandToExecute)&>“file.txt”调用echo%errorlevel%
然后,当执行
call
命令时,将调用一个新的解析阶段,然后在执行第一个命令且
errorlevel
发生更改后,替换行中的变量,并将正确的值发送到文件

已编辑以适应评论-只是测试会话(抱歉,西班牙语区域设置)

A
W:\41996740>dir /b

W:\41996740>( commandToExecute ) & >"file.txt" call echo %^errorlevel%
"commandToExecute" no se reconoce como un comando interno o externo,
programa o archivo por lotes ejecutable.

W:\41996740>dir /b
file.txt

W:\41996740>type file.txt
9009

W:\41996740>( dir /b file.txt ) & >"file.txt" call echo %^errorlevel%
file.txt

W:\41996740>type file.txt
0

W:\41996740>( dir /b file.exe ) & >"file.txt" call echo %^errorlevel%
No se encuentra el archivo

W:\41996740>type file.txt
1

W:\41996740>
cmd /D /V:ON /C "command to execute&>>currError.txt echo !errorlevel!"
==> type currError.txt
The system cannot find the file specified.

==> cmd /D /V:ON /C "echox "x"&>>currError.txt echo %date% %time% errorlevel !errorlevel!"
'echox' is not recognized as an internal or external command, operable program or batch file.

==> type currError.txt
02.02.2017  9:12:28,34 errorlevel 9009

==> cmd /D /V:ON /C "echo "x"&>>currError.txt echo %date% %time% errorlevel !errorlevel!"
"x"

==> type currError.txt
02.02.2017  9:12:28,34 errorlevel 9009
02.02.2017  9:12:43,32 errorlevel 0

==> rem output fails if "command to execute" is syntactically wrong

==> cmd /D /V:ON /C "if "x"&>currError.txt echo %date% %time% errorlevel !errorlevel!"
& was unexpected at this time.

==> type currError.txt
02.02.2017  9:12:28,34 errorlevel 9009
02.02.2017  9:12:43,32 errorlevel 0

==> rem "call" approach for the sake of completeness:

==> echox "x"&>>currError.txt call echo %date% %time% errorlevel %errorlevel^%
'echox' is not recognized as an internal or external command, operable program or batch file.

==> type currError.txt
02.02.2017  9:12:28,34 errorlevel 9009
02.02.2017  9:12:43,32 errorlevel 0
02.02.2017 14:42:28,06 errorlevel 9009

==> rem fails as well if "command to execute" is syntactically wrong

==> if "x"&>>currError.txt call echo %date% %time% errorlevel %errorlevel^%
& was unexpected at this time.

==> type currError.txt
02.02.2017  9:12:28,34 errorlevel 9009
02.02.2017  9:12:43,32 errorlevel 0
02.02.2017 14:42:28,06 errorlevel 9009

==>
set "p=%"
( commandToExecute ) & >"file.txt" call echo %p%errorlevel%p%