使用 teraterm API 调用 'setexitcode' 设置 WIndows 系统变量 %errorlevel% 需要 2 个 teraterm 会话才能注册

Using teraterm API call 'setexitcode' to set WIndows system variable %errorlevel% requires 2 teraterm sessions to register

以下 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 之后的数字(例如这些示例中的 10。)是一个命令行参数,在脚本中称为 param2

temp.ttl

str2int num param2
setexitcode num  

no_op.ttl

;Do nothing
num = 0  

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

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

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

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

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

用法 - TTPMACRO

setexitcode(来自 Tera Term API 参考文档。)使脚本能够 return 调用进程的值,例如,在这种情况下是 CMD window。我正在使用此 returned 值来确定 Windows 内所有内部脚本步骤是否已正确执行。 (除此问题必不可少的那些行外,所有行均已删除。)

而且,关于 Errorlevel 的使用信息指出:

A preferred method of checking Errorlevels is to use the %ERRORLEVEL% variable:

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
start /w ttpmacro.exe c:\temp\temp.ttl 1 && if errorlevel 1 (echo TIMEOUT ) Else ( Echo PASS ) 

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

因此,%errorlevel% 将替换为 previous 运行.

返回的值

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

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