CMD命令行: 一个CMD命令,一个命令行,没有BAT文件。
是否有可能将ERRORLEVEL直接写入TXT文件?
我试过但我失败了。
我不想每次都创建和保存BAT文件。
我更喜欢更简单的方法:CMD单一命令加上TXT文件中的ERRORLEVEL导出,所有这些都在一个命令行中。
托米
答案 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上测试