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

时间:2017-02-02 07:48:33

标签: batch-file cmd output errorlevel

CMD命令行: 一个CMD命令,一个命令行,没有BAT文件。

是否有可能将ERRORLEVEL直接写入TXT文件?

我试过但我失败了。

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

我更喜欢更简单的方法:CMD单一命令加上TXT文件中的ERRORLEVEL导出,所有这些都在一个命令行中。

托米

3 个答案:

答案 0 :(得分:4)

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

( commandToExecute ) & >"file.txt" echo %errorlevel%

问题是解析完整的命令行然后执行。在解析阶段,在开始执行命令之前,所有变量读取操作都将从存储在变量中的值替换为命令。

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

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

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

( commandToExecute ) & >"file.txt" echo 0

处理它的常用方法是启用延迟扩展。这允许您将用于访问变量的语法从%var%更改为!var!。这向解析器指示必须延迟变量/值替换,直到执行命令,而不是解析行。这是通过setlocal enabledelayedexpansion命令完成的。

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

( commandToExecute ) & >"file.txt" echo !errorlevel!

但启用了延迟扩展后,命令中的!会出现问题,因为解析器会将其视为变量读取请求的一部分。

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

( commandToExecute ) & >"file.txt" call echo %^errorlevel%

使用^无法识别变量,并且该命令将被解析并执行为

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

然后,当执行call命令时,将调用一个新的解析阶段,然后,在执行第一个命令并且errorlevel已更改之后,该行中的变量将替换为正确的值将发送到文件。

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

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>

答案 1 :(得分:0)

使用enabled Delayed Expansion的另一种方法(请参阅/V:ON切换),仅为了完整性:

cmd /D /V:ON /C "command to execute&>>currError.txt echo !errorlevel!"

示例(输出到currError.txt扩展为包含日期和时间戳以及裸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

==>

答案 2 :(得分:0)

首先,使用百分号定义“p”变量:

set "p=%"

然后,使用以下行:

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

在Windows 8.1上测试