1

以下 4 个文件可用于演示我看到的问题:(为了便于阅读,每个文件都进行了简化。)

temp1.bat:

@echo off
start /w ttpmacro.exe c:\temp\temp.ttl 0 
start /w ttpmacro.exe c:\temp\no_op.ttl && if %errorlevel% EQU 0 (echo PASS ) Else ( Echo TIMEOUT )

temp2.​​bat:

@echo off
start /w ttpmacro.exe c:\temp\temp.ttl 1 && if %errorlevel% EQU 0 (echo PASS ) Else ( Echo TIMEOUT )  

注意:c:\temp\temp.ttl 后面的数字(例如这些示例中的 a1或。)是命令行参数,an在脚本 0中称为param2 。

临时文件

str2int num param2
setexitcode num  

no_op.ttl

;Do nothing
num = 0  

从 Windows CMD 提示符运行 temp1.bat,比较语句每次都会产生预期的响应,始终如一。

从 Windows CMD 提示符运行 temp2.​​bat,比较语句的结果在第一次运行后始终是意外的,但在第二次调用时会产生预期的结果。

我遇到的问题是,在退出 teraterm 脚本的单个实例时,Windows 似乎没有将该值注册到其 %errorlevel% 变量中。no-op.ttl在更新 %errorlevel% 变量之前, 我必须运行一个子序列脚本(例如),并且比较测试会产生预期的结果。

有人可以确定在运行 Tera Term 脚本的单个实例后如何正确更新 Windows %errorlevel% 变量吗?

有关 Tera Term 脚本和批处理文件中关键项目的其他信息

用法 - TTPMACRO

setexitcode(来自 Tera Term API 参考文档。)使脚本能够将值返回给调用进程,例如在本例中为 CMD 窗口。我正在使用此返回值在 Windows 中确定所有内部脚本步骤均已正确执行。(除此问题所必需的那些行外,所有行都已删除。)

并且,错误级别的使用信息说明:

检查错误级别的首选方法是使用 %ERRORLEVEL% 变量:

IF %ERRORLEVEL% NEQ 0 Echo An error was found
IF %ERRORLEVEL% EQU 0 Echo No error found

IF %ERRORLEVEL% EQU 0 (Echo No error found) ELSE (Echo An error was found)
IF %ERRORLEVEL% EQU 0 Echo No error found || Echo An error was found
4

1 回答 1

2
start /w ttpmacro.exe c:\temp\temp.ttl 1 && if errorlevel 1 (echo TIMEOUT ) Else ( Echo PASS ) 

cmd解析代码块时,它会用该变量的当前值替换任何代码,然后%var%执行代码

因此,%errorlevel%被上一次运行返回的值替换。

如果运行时间(即当前)为 n或大于 n ,则这是使用errorlevel-为 TRUE 的传统方式。因此总是正确的。是对 errorlevel=0 的测试。也是如此,只是前者可以在块内使用,而后者不能。IF ERRORLEVEL nerrorlevelIF ERRORLEVEL 0IF NOT ERRORLEVEL 1IF %ERRORLEVEL%==0

SO上有很多关于delayedexpansion- 可以使用的另一种方法。

于 2019-08-26T17:58:26.330 回答