ERRORLEVEL 与 %ERRORLEVEL% 与感叹号 ERRORLEVEL 感叹号

2024-04-23

我想我对 ERRORLEVEL 与 %ERRORLEVEL% 有基本的了解,但是!ERRORLEVEL!让我困惑。

我正在制作一个调用可执行文件的脚本,然后使用任务列表来查看它是否正在运行,然后使用taskkill来杀死它(如果是),然后尝试输出错误级别并重复其他可执行文件,我意识到我真的不明白批处理中的错误级别。

我设置了一个等于 !errorlevel! 的变量 然后在回显中使用不带引号的变量,当设置后出现错误时,变量从一个 uint16 更改为另一个 uint16,就像它是对真实变量的引用而不是副本。我想要副本。有人可以解释一下这些人之间的区别吗?


更新: 这是我正在处理的片段。

for %%P in (%executableList%) do (
   echo ----------------------------------------------------------------------------------       
    set exeErrorlevel=0
    set running=false

    start %%~fP  
    set exeErrorlevel=!ERRORLEVEL!

    rem for debugging purposes
    echo %%~nP%%~xP older errorlevel %ERRORLEVEL%       
    echo %%~nP%%~xP newer errorlevel !ERRORLEVEL!        
    echo before tasklist running var is : !running!

    tasklist /FI "IMAGENAME eq %%~fP" | find /I /N /C  "%%~fP" >nul && set running=true

    echo after tasklist is running var is: !running!

    if !running! equ true ( 
       echo %%~nP%%~xP Program is running
       taskkill /F /IM %%~nP%%~xP /T
       echo %%~nP%%~xP Program was killed          

       if !exeErrorlevel! == 0 (
           echo %passString% %%~nP%%~xP process was started and killed safely 
           echo %passString% %%~nP%%~xP process was started and killed safely >>%outputfile%
       ) else ( 
           echo %failString% %%~nP%%~xP process was killed with errorcode !exeErrorlevel!
           echo %failString% %%~nP%%~xP process was killed with errorcode !exeErrorlevel! >>%outputfile%                  
       )         
    ) else (             
         if !exeErrorlevel! == 0 (
             echo %passString% %%~nP%%~xP process exited safely
             echo %passString% %%~nP%%~xP process exited safely >>%outputfile%
         ) else (                 
             taskkill /F /IM %%~nP%%~xP /T
             echo %failString% %%~nP%%~xP process abruptly exited with errorcode !exeErrorlevel! 
             echo %failString% %%~nP%%~xP process abruptly exited with errorcode !exeErrorlevel! >>%outputfile%                  
         )                    
    )

    echo. >>%outputfile%


)

我需要确保 exeErrorlevel 在某个时间点拥有错误级别的副本 - 我只想捕获来自 exe 的错误,而不是来自 tasklist/find/taskill 的成功/失败。我担心 exeerrorlevel 由于延迟扩展而在执行时访问延迟的错误级别。也许应该设置 exeErrorlevel=%errorlevel% 来代替。在我回显旧变量和新变量的行中通常返回不同的整数?在我所有的测试运行中 %errorlevel% 似乎通常返回 0 而 !errorlevel!对于具有错误退出代码的可执行文件始终不为零。


错误级别

errorlevel是动态变量的名称(它不放置在环境块中,而是保存在内存中),用于存储先前执行的进程/命令的退出代码(如果设置了该值,则读取here https://stackoverflow.com/q/34968009/2861476, here https://stackoverflow.com/q/34987885/2861476, here https://stackoverflow.com/q/30714985/2861476 and here https://stackoverflow.com/q/41318027/2861476).

The if命令允许使用if errorlevel n语法来检查值是否errorlevel变量大于或等于n,而不涉及批处理解析器来检索变量的值。

但是,如果我们让批处理解析器处理变量值,%errorlevel%只是对变量中存储的值的引用,即读取操作。就像!errorlevel!。两者之间的主要区别是when该值的检索取决于rules https://stackoverflow.com/a/4095133/2861476关于变量扩展。

使用起来有很大的区别if errorlevel或检索变量中的值:

  • 变量读取操作将检查环境块是否包含具有指定名称的变量。
  • The if构造不会进行此测试。

如果你做类似的事情set errorlevel=10,动态errorlevel值将不会被检索%errorlevel% or !errorlevel!因为环境中设置的值将隐藏动态值。但作为if errorlevel不读取环境块,而是直接读取保存该值的内部变量,它将正常工作。

变量

批处理语法不包括让多个变量指向内存中相同值的选项,如果其中一个变量更改其值,另一个变量也会反映该更改。

这种行为可以通过正确使用变量扩展中的不同阶段来模拟,将一个变量正确设置为另一个变量的名称,并强制批处理解析器对命令执行两次传递,以便第一个变量解析为第二个变量的名称,并且到真正的价值。

你的问题

仅用于分析的简化(甚至不起作用)代码

 1  for %%P in (%executableList%) do (
 2  
 3      start %%~fP  
 4      set exeErrorlevel=!ERRORLEVEL!
 5  
 6      echo %%~nP%%~xP older errorlevel %ERRORLEVEL%       
 7      echo %%~nP%%~xP newer errorlevel !ERRORLEVEL!        
 8      ....
 9      if !running! equ true ( 
10         taskkill /F /IM %%~nP%%~xP /T
11         if !exeErrorlevel! == 0 (
12          ....
13         ) else ( 
14             echo process killed with errorcode !exeErrorlevel!
15         )         
16      ) else (             
17           if !exeErrorlevel! == 0 (
18             ....
19           ) else (                 
20               taskkill /F /IM %%~nP%%~xP /T
21               echo process abruptly exited with errorcode !exeErrorlevel! 
22           )                    
23      )
  • 第 1 行:中的代码do子句,所有代码,都被解析。任何%var%变量读取操作已从代码中删除,并在开始执行之前替换为变量内的值。这意味着,如果变量更改其值,您将无法检索更改后的值,因为不存在读取操作,只能检索变量中的初始值。

  • 第 3 行:可执行文件在单独的进程中启动,无需等待进程结束。是不是重要?请参阅下一行

  • 第 4 行:当前(使用延迟扩展)值errorlevel变量被检索并存储在exeErrorlevel多变的。但存储的值不是errorlevel由可执行文件返回(单独的进程,不等待它结束,我们如何知道exit code = errorlevel是?),但是退出代码start命令。

  • 第 6 行:作为%errorlevel%读取操作被删除,这一行将回显存储在errorlevel之前的变量do条款开始执行。

  • 第 7 行:当前值errorlevel变量被检索。在这里,我们可能会遇到问题。正在执行的脚本如何命名?之间存在差异.bat and .cmd。论成功set第 4 行中的命令将清除(设置为 0)errorlevel变量,如果这是一个.cmd文件,但不会改变errorlevel如果它是一个.bat file.

  • 第 11、14、21 行:如图所示exeErrorlevel变量不包含有效值。不,将行更改为!errorlevel!不会检索进程的退出代码,但会检索进程的退出代码taskkill.

为了能够检索进程的退出代码/错误级别,我们需要等待它结束。如果您需要启动该进程,如果它继续运行,则将其杀死,并且在这两种情况下检索退出代码,直接调用可执行文件或使用start "" /wait programName,并并行运行终止进程(例如start /b "" monitor.bat programName或启动程序之前类似的事情)。主进程将等待并检索退出代码。监控进程负责处理杀戮。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ERRORLEVEL 与 %ERRORLEVEL% 与感叹号 ERRORLEVEL 感叹号 的相关文章

  • 我需要为我的应用程序制作和加载多大尺寸的 ImageList 图标(考虑更高的 DPI)?

    我有一个CListCtrl http msdn microsoft com en us library hfshke78 aspx控制 或ListView http msdn microsoft com en us library wind
  • 如何根据操作系统系列拥有不同的依赖关系

    我正在编写一个跨平台库 它具有特定于平台的依赖关系 一个用于类 UNIX 平台 一个用于 Windows 这些板条箱仅在特定平台上编译 因此我不能正常地将它们全部添加到依赖项下 在我实际使用的 Rust 代码中cfg属性 例如 cfg un
  • Windows批量编程中读取文件名

    我想在Windows批处理编程中读取文件的名称 我尝试使用不同的方法但失败了请帮助 下面给出了场景 我的文件夹中有不同的文件 但所有文件的文件名长度相同 例如 1000342578 30062011 PDF 1000342329 30062
  • chcp 65001 代码页导致程序终止且没有任何错误

    Problem 当我想要的时候问题就出现了inputPython 解释器中的 Unicode 字符 为简单起见 我在示例中使用了变音符号 但我第一次遇到波斯语字符 每当我使用 Python 时CHCP 65001 https ss64 co
  • XP 和 Vista 之间使用 Winsock API 的 UDP 多播差异

    Windows XP 和 Windows Vista 之间设置 UDP 多播套接字所需的实现似乎有所不同 具体来说 在 Windows XP 下 您must call bind 在您可以引用任何特定于多播的套接字选项之前 然而 在windo
  • Windows 服务和 Windows 进程有什么区别?

    是什么不同之处窗户之间service和一个窗户process 服务是真正的 Windows 进程 没有区别 服务的唯一特殊之处在于它由操作系统启动并在单独的会话中运行 一种独立的方式 可防止其干扰桌面会话 传统上命名为daemon http
  • 当我启动程序时,Arduino IDE (Win10) 崩溃

    我的 Arduino IDE Win10 上的版本为 1 8 12 在启动时崩溃 运行arduino debug exe我收到此错误消息 C Program Files x86 Arduino gt arduino debug exe Se
  • 如何从 Emacs 中运行 Cygwin Bash Shell?

    我在 Windows 上运行 GNU Emacs 因此输入 M x shell 启动 Windows 命令行 DOS shell 但是 我希望能够从 Emacs 中运行 Cygwin Bash Shell 或任何其他非 Windows sh
  • shell进程的并行执行

    有没有一个工具可以在 Windows 批处理文件中并行执行多个进程 我发现了一些有趣的 Linux 工具 parallel http mi eng cam ac uk er258 code parallel html and PPSS ht
  • 安装 confluence-kafka 时“文件名或扩展名太长”?

    我在使用 pip install confluence kafka 安装 confluence kafka 时遇到一些问题 但我收到此错误 文件名或扩展名太长 详细信息如下 Collecting confluent kafka Using
  • 无法加载 php_curl

    我已经在WindowsXp上安装了php5 2 13 apache2 2 15 将C php添加到PATH ssystem变量中 我无法启用卷曲扩展 我配置了extension dir并删除了 在 php ini 中形成 php curl
  • 以管理员身份从 cmd 批处理运行 PowerShell 脚本

    我有一个 PowerShell 设置 我想在执行策略可能受到限制并且需要管理员权限的计算机上执行 理想情况下 我可以将其包装在 cmd 批处理中 如下所示 powershell Command Start Process powershel
  • 如何像用户打字一样将输入发送到控制台?

    这是我的问题 我有一个程序必须在 TTY 中运行 cygwin 提供了这个 TTY 当我重定向 stdIn 时 程序失败 因为它没有 TTY 我无法修改该程序 并且需要某种方法使其自动化 如何抓取 cmd exe 窗口并向其发送数据并使其认
  • 批处理中嵌套 IF ( IF ( ... ) ELSE( .. ) ) 语句

    我正在尝试写一个IF ELSE语句嵌套在另一个语句中IF陈述 这是我所拥有的 IF dirdive 1 IF DEFINED log ECHO DATE TIME gt gt log FOR R root1 G IN DO SET G G
  • 双击时将文件名传递给 Windows 批处理 (.bat) 脚本,以便它将以八度运行

    我是使用批处理脚本的新手 并且对八度音程有一定的经验 我有很多使用八度函数检查的数据文件 我正在尝试进行设置 以便我可以双击具有自定义扩展名的文件来直接打开八度函数 想想 当我双击这个文本文件时 它会在记事本中打开 为此 我写了一个非常基本
  • 保存并加载 .bat 游戏

    我正在制作一个用bat编写的文本游戏 并且游戏已经完成 或者更多 其中的很大一部分 例如命令 以及可以玩它的阶段 但是 我想添加保存游戏并再次加载的功能 我认为可以通过让 bat 文件写入需要保存的变量 例如项目变量 来做到这一点 但是 我
  • 批量设置变量=%变量:~1%是什么意思

    谁能解释一下是什么 1 在批处理文件中的以下语句中 我分配的值 variable到服务器名称并尝试过echo variable 我得到与输出相同的服务器名称 谁能解释一下下面的语句是如何工作的 set variable variable 1
  • 更改Word文档中的文本字体颜色

    我写了一个小测试词插件 但找不到方法改变字体颜色一句话 这是我的代码 var wordsList this Application ActiveDocument Words wordsList i Font TextColor WdColo
  • 使用命令提示符查找 CPU 数量和每个 CPU 的核心数

    我正在尝试使用命令提示符检索 CPU 数量和每个 CPU 的核心数 我已经执行了以下命令 wmic cpu get NumberOfCores NumberOfLogicalProcessors Format List 我收到此错误 wmi
  • 在 Windows 中使用 OpenAI API 密钥时出现问题

    我必须在自定义数据集上微调 OpenAI 模型 我已经创建了 jsonl 格式的数据集 我在 Windows 命令行上使用以下命令 set OPENAI API KEY

随机推荐