FOR /F 命令循环中的错误级别返回意外结果

2024-03-27

我正在尝试记录输出net stop同时还捕捉其ERRORLEVEL.

基于这个问题 https://stackoverflow.com/questions/3088712/,我在嵌套子例程中尝试了以下操作:

set /a loopIndex=0
for /F "usebackq delims=" %%i in (`net stop %SERVICE_NAME%`) do (
 if !loopIndex! EQU 0 if !errorlevel! EQU 1 set statementError=1
 set /a loopIndex+=1
 call :logMessage "%%i"
)
echo statementError: %statementError%

然而,这不起作用,抛出1即使当net stop成功了。

如果没有临时文件,这可能吗?如果没有,临时文件解决方案会是什么样子?


正如@drruruu 在这个问题中所问的:

这可能吗without临时文件?

是的,没有临时文件也是可能的。通过在 IN 子句中将 ERRORLEVEL 发送到 STDOUT 并在 LOOP 子句中对其进行解析。也可以通过延迟扩展来完成.

为了方便起见,这里举一个例子。它有点像 FINDSTR 包装器,用于在批处理本身中搜索字符串。它涵盖了所有常见情况,您需要知道出了什么问题、出问题在哪里以及为什么出问题:

  • DO()子句(又名循环)出错并获取相应的退出代码
  • IN()子句出错并获取相应的退出代码
  • FOR 子句直接出错(语法错误、分隔符错误等)

以下脚本使用 FINDSTR 和标志作为参数模拟这些情况:

  • 第一个参数是要搜索的字符串。
  • 第二个参数是 0/1 标志,用于模拟循环中与 FINDSTR 无关的错误。
  • 第三个参数是模拟 FOR 子句本身错误的方法(不是 IN 或 LOOP 上的错误)
  • 第四个参数是测试 FINDSTR 的方法,当要搜索的文件不存在时退出 255。遗憾的是,FINDSTR 在文件中找不到字符串时会以 1 退出,而在找不到任何文件时也会以 1 退出。通过第四个参数,我们模拟了 FINDSTR 在以下情况下以 255 退出的情况:它找不到该文件。
    @echo off
    SETLOCAL ENABLEEXTENSIONS
    IF ERRORLEVEL 1 (
      ECHO Can't use extensions
      EXIT /B 1
    )    
    SETLOCAL ENABLEDELAYEDEXPANSION
    IF ERRORLEVEL 1 (
      ECHO Can't use delayed expansion 
      EXIT /B 1
    )
    REM The string to search
    SET "LOCALV_STRING=%1"
    REM The file to search. Myself.
    SET "LOCALV_THIS=%0"
    REM Store the exit code for the LOOP
    SET "LOCALV_ERR="
    REM Store the exit code for the IN
    SET "LOCALV_RET="
    REM Flag to stop parsing output for error simulation
    SET "LOCALV_END="
    REM To get the exit code of the IN clause, we get it through expansion with a second FOR loop using the well known CALL expansion and send it on STDOUT in the form "__<code>"
    FOR /F "%~3tokens=*" %%M IN ('FINDSTR "!LOCALV_STRING!" "!LOCALV_THIS%~4!" ^
                               ^& FOR /F %%A IN ^("ERRORLEVEL"^) DO @CALL ECHO __%%%%A%%') DO (
      SET "LOCALV_TMP=%%~M"
      REM Simulate that something goes wrong with FINDSTR I/O
      IF NOT EXIST "!LOCALV_THIS!%~4" ( 
        SET "LOCALV_RET=255"
        SET LOCALV_END=1
      )
      IF "!LOCALV_END!" == "" (
        REM SImulate a problem in the loop
        IF "%2" == "1" (
          (CMD /C EXIT /B 127)
          SET LOCALV_END=1
        ) ELSE (
          IF NOT "!LOCALV_TMP:~0,2!" == "__" ECHO Found: !LOCALV_TMP!
        )
      )
      IF "!LOCALV_TMP:~0,2!!LOCALV_RET!" == "__" SET "LOCALV_RET=!LOCALV_TMP:__=!"
    )
    SET "LOCALV_ERR=!ERRORLEVEL!"
    REM LOCALV_ERR get the exit code from the last iteration of the for loop
    REM LOCALV_RET get the exit code from the IN command of the for loop
    REM Sadly, FINDSTR exit with 1 if it did not find the string, but also with 1 if it could not found the file. To simulate a proper handling of exit code for 
    REM abnormal hardware/software situation, %2 is used to force a 255 exit code
    REM If LOCALV_RET is not defined, this means the FOR...ECHO__.. wasn't executed, therefore there is a pb with the FOR LOOP
    IF "!LOCALV_RET!" == "" (
      ECHO Something went wrong with FOR...
      EXIT /B 1
    )
    REM If LOCALV_RET is defined, this means the FOR...ECHO__.. was executed and the last loop operation has parsed the FINDSTR exit code, LOCALV_RET get its exit code
    REM If LOCALV_RET is defined but LOCALV_ERR is not "0", something went wrong in the loop (I/O error, out of memory, wathever you could think), the problem is not FINDSTR
    IF NOT "!LOCALV_ERR!" == "0" (
      ECHO Error in the loop while searching "!LOCALV_STRING!" in "!LOCALV_THIS!", exit code !LOCALV_RET!. Loop exit code : !LOCALV_ERR!.
      EXIT /B 4
    )
    REM If LOCALV_RET is "0", FINDSTR got matching strings in the file, if "1", FINDSTR don't find any matching string, if anything else, FINDSTR got a problem like failed I/O.
    REM If LOCALV_RET is "0" and LOCALV_ERR is "0", everything is ok.
    IF "!LOCALV_RET!" == "0" (
      ECHO Success.
      EXIT /B 0
    )
    REM If LOCALV_RET is "1" and LOCALV_ERR is "0", FINDSTR failed to find the string in the file "or" failed to find file, for the latter we simulate that FINDSTR exit with 255 .
    IF "!LOCALV_RET!" == "1" (
      ECHO FINDSTR failed to find "!LOCALV_STRING!" in "!LOCALV_THIS!", exit code !LOCALV_RET!. Loop exit code : !LOCALV_ERR!.
      EXIT /B 2
    )
    REM If LOCALV_RET isn't "0" nor "1" and LOCALV_ERR is "0", FINDSTR failed to do the job and LOCALV_RET got the exit code.
    ECHO FINDSTR: Houst^W OP, we've got a problem here while searching "!LOCALV_STRING!" in "!LOCALV_THIS!", exit code !LOCALV_RET!. Loop exit code : !LOCALV_ERR!.
    EXIT /B 3

脚本输出:

  1. 运行正常,模拟无错误。
PROMPT>.\for.bat FOR 0 "" ""
Found: FOR /F "%~3tokens=*" %%M IN ('FINDSTR "FOR" ""
Found: ^& FOR /F %%A IN ^("ERRORLEVEL"^) DO @CALL ECHO __%%%%A%%') DO (
Found: REM If LOCALV_RET is not defined, this means the FOR...ECHO__.. wasn't executed, therefore there is a pb with the FOR LOOP
Found: ECHO Something went wrong with FOR...
Found: REM If LOCALV_RET is defined, this means the FOR...ECHO__.. was executed and the last loop operation has parsed the FINDSTR exit code, LOCALV_RET get its exit code
Success.
  1. 运行正常,没有错误模拟,有FINDSTR在文件中找不到的字符串。
PROMPT>.\for.bat ZZZ 0 "" ""
FINDSTR failed to find "ZZZ" in ".\for.bat", exit code 1. Loop exit code : 0.
  1. 模拟LOOP子句中的错误,与FINDSTR无关。
PROMPT>.\for.bat FOR 1 "" ""
Error in the loop while searching "FOR" in ".\for.bat", exit code 0. Loop exit code : 127.
  1. 使用未知的“delims token”选项模拟 FOR 子句中的错误。
PROMPT>.\for.bat FOR 0 "delims" ""
delimstokens=*" was unexpected.
Something went wrong with FOR...
  1. 如果找不到文件,则模拟 FINDSTR 退出 255。
PROMPT>.\for.bat FOR 1 "" "ERR"
FINDSTR : Can't open
FINDSTR: HoustW OP, we've got a problem here while searching "FOR" in ".\for.bat", exit code 255. Loop exit code : 0.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

FOR /F 命令循环中的错误级别返回意外结果 的相关文章

  • Visual Studio Code 安装位置

    我几天前安装了 Visual Studio Code 但现在在我的计算机上找不到可执行文件 它在哪里 我已经检查了程序和功能 我还检查了我的路径 由于某种原因 它也不在其中 更新 10 11 2018 如果您进行完全重新安装 包括卸载计算机
  • Windows 相当于 Mac OS X“打开”命令

    刘畅在这里问了一个与此非常相似的问题 Linux 相当于 Mac OS X 打开 命令 https stackoverflow com questions 264395 linux equivalent of the mac os x op
  • Python:当键盘中断被转发到多处理子进程时?

    我在 Windows 上执行了以下测试代码 import multiprocessing import time def child while True time sleep 2 if name main multiprocessing
  • Java更改系统换行符

    在 Windows 上 使用System out println 打印出来 n r而在 Unix 系统上你会得到 n 有没有办法告诉java你想使用什么换行符 正如其他人已经说过的 系统属性line separator包含实际的行分隔符 奇
  • NodeJS 连接到 SQL Server getaddrinfo ENOTFOUNT

    我正在尝试使用 Knex js 连接到 Microsoft SQL Server 但收到 getaddrinfo ENOTFOUND 我知道这表明 NodeJS 无法解析地址 通常是通过 DNS 或协议问题 const knex requi
  • 每次批量从选择中获取随机句子

    有没有一种方法可以做到这一点 而不是每次都设置相同的回显 您可以给出一个回显列表 并且每次到达该回显命令时它都会选择一个随机的回显 是的 这是一个概念证明 echo off setlocal enabledelayedexpansion s
  • 套接字是否可以仅针对 recv() 函数设为非阻塞?

    我希望能够打电话recv 不必阻塞 所以我想让它成为非阻塞 但我不希望它在发送数据时是非阻塞的 那么能否将套接字设为非阻塞 recv 函数 或者阻塞 非阻塞模式是否影响所有套接字函数 对于 Windows 您可以使用ioctlsocket
  • “PWC6345:调用 javac 时出错。”使用 Jetty WTP 插件在 Jetty 上部署 JSP 页面时出错

    我正在尝试在 Jetty 上部署 JSP 页面 使用Jetty WTP 插件 http wiki eclipse org Jetty WTP Plugin对于 Eclipse 但我收到以下错误 Jetty 好像找不到javac 我需要在 E
  • 通过从 .BAT 中查找进程正在使用的端口来终止进程

    在 Windows 中 什么可以查找端口 8080 并尝试通过 BAT 文件终止它正在使用的进程 打开命令提示符并运行以下命令 C Users username gt netstat o n a findstr 0 0 3000 TCP 0
  • 如何远程获取系统的网络共享和连接?

    我正在寻找一种远程获取类似于以下控制台应用程序的信息的方法 net use 净份额 网络统计 ano 但是 我需要能够在系统上运行第三方应用程序的情况下执行此操作 这有效地排除了使用 psexec 远程执行命令 因为 psexec 将作为服
  • cmd的字符集

    C Users Kolink gt php r echo C Users Kolink gt echo 正如你所看到的 一个程序输出一个 结果是 但使用echo命令给出所需的字符 并且 我可以配置 PHP 也许是脚本开头的某个命令 来输出正
  • 阻止 gulp 更改 shell/cmd 标题名称

    当 gulp 被调用时 它会将我的 cmd windows 标题更改为 gulp 我希望窗口名称保持原样 我知道我可以使用https www npmjs com package gulp shell https www npmjs com
  • 根据文件内容重命名文件批处理文件

    我需要一个批处理文件来读取 XYZ txt 文件中存在的描述名称 并根据描述名称重命名该文件名 例如 我有一个名为 nest txt 的文件名 当我们打开文本文件 nest txt 时 文件名的第二行有说明 Description Man
  • MFC CMenu 工具提示未显示

    我尝试使用类似的东西来设置 CMenu 项的工具提示 如所述here https stackoverflow com questions 2400180 mfc how to add tooltip in cmenu items 但它只是显
  • 程序关闭后,Windows 中的文件可以锁定多长时间?

    在我使用的几个脚本中 我遇到了间歇性的问题 有时 尝试删除文件时脚本会失败 根据错误日志 由于该文件被其他进程访问 我猜测在对文件执行的上一个操作结束后 Windows 没有时间释放该文件 窗口应该有时间再次释放文件的时间是多少时间 如果
  • Python ctypes:SetWindowsHookEx 回调函数从未被调用

    我正在尝试用 Python 编写一个程序 该程序可以识别何时显示警报框 对话框 它正在处理多个监视器 我希望它在任务栏图标闪烁 弹出错误 通知等时在辅助监视器上显示可视化效果 据我所知 检测这些事件的方法是使用消息挂钩 如下所述 http
  • PHP OCI8 扩展不适用于 PHP 7 64 位

    我已经安装了 APACHE 2 4 x64 和 PHP7 x64 并下载了 PHP OCI 64 位库 但问题是每当我从 cli 运行 PHP 脚本时 它都会说 PHP启动 无法加载动态库 E 软件 服务器 php 7 0 11 Win32
  • 无法在 Windows 的多处理环境中“pickle”Tkinter 对象

    我正在尝试创建一个应用程序 其中 Tkinter GUI 由不断获取数据的其他对象更新 我在使用多线程时遇到问题 因此我决定尝试使用多处理模块 我发现您无法在其中运行 Tkinter 窗口multiprocessing Process 这是
  • Python执行windows cmd函数

    我知道你可以使用 subprocess 通过 Python 脚本运行 Linux 终端命令 subprocess call ls l for linux 但我找不到在 Windows 上做同样事情的方法 subprocess call di
  • 设置 eclipse 进行 Windows 驱动程序开发

    我正在尝试使用 WDK 7 1 0 编写用户模式 Windows XP Vista 和 7 虚拟打印机驱动程序 我打算使用 eclipse IDE 进行开发 所以想知道是否可以进行相同的设置 我希望做以下事情 1 Eclipse 能够识别

随机推荐

  • link_to image_tag 与 Rails 中的内部文本或 html

    我想用 Ruby on Rails 输出以下内容link to and image tag方法 a href Lorem Ipsum img src images menu arrow down gif a Rails 中什么是好方法 您可
  • 为什么在 window 对象中定义 body [重复]

    这个问题在这里已经有答案了 我只是在控制台上玩 注意到如果我输入 body它返回 这显然与window body 因此也返回了 Then document body也返回 正如预期的那样 因为身体是身体的一部分document对象 据我所知
  • CakePhp - 关联数据未保存(但主模型数据确实保存)

    所以 我在 CakePhp 中有一个使用 Formhelper 的表单 此表单中有两个关联模型 Booking 和 Guest 数据库表似乎设置正确 因为页面通过模型中的关联足够准确地填充了值 保存表单数据时 会保存预订信息 但不会保存宾客
  • 如何找出Oracle死锁的原因

    当使用多个用户测试我的应用程序时 我遇到了 ORA 00060 死锁错误 我不确定如何确定此错误的原因 因此如果有人可以帮助我 我将不胜感激 我查看了为此事件生成的跟踪文件 它显示了哪个查询导致了此事件 UPDATE TABLE A SET
  • Google Ads API - “失败,状态为“PERMISSION_DENIED” - “用户无权访问客户。”

    我正在尝试使用 Google ads API 运行 Ubuntu 20 04 Python 3 9 客户端库工作的最低要求是 3 6 使用 google ads api V6 这是我的痛苦故事 我创建了一个测试管理员帐户 A 生成了开发人员
  • 如何使用 grunt-sass 编译多个 scss 文件

    我正在尝试将多个 scss 文件编译为单个 CSS 文件 这实际上有效 但只获取第一个文件 sass Task dist files css test css sass scss 我们没有安装 ruby 所以 grunt contrib s
  • React Hooks:如何在 useEffect 中设置 State?

    我正在尝试从 firebase 获取数据并使用 useState 挂钩将检索到的数据设置为我的状态 我知道我的 API 调用正在工作 因为我可以从 firebase 记录数据 但当我使用 setState 时 它并没有达到我的状态 由于某种
  • 为什么 R 有时会停止显示输出?

    有时 R 会停止显示输出 我输入数字 1 然后按回车键 但什么也没有出现 这种情况是在我按下窗口中的 停止 图标后发生的 该图标用于停止长时间的计算 我在 Mac 上使用 R 2 11 0 按 STOP 是否会导致 R 停止显示输出 如何让
  • 使用 C# 比较嵌套对象属性

    我有一个方法可以比较两个对象并返回所有不同属性名称的列表 public static IList
  • 在 Java 中使用嵌套枚举类型

    我心中有一个涉及嵌套枚举的数据结构 这样我就可以执行如下操作 Drink COFFEE getGroupName Drink COFFEE COLUMBIAN getLabel 如果有方法声明 someMethod Drink type s
  • 从js数组中删除双引号

    我有这种类型的数组 80 529299450867271 7 3884550841172976 80 528953669541707 7 3875715810979612 80 528714422417153 7 3867339810469
  • 使用rvest,如何从submit_form()返回的对象中提取html内容

    我正在尝试从 pems dot ca gov 下载一些流量数据 如下这个话题 https stackoverflow com questions 28418770 using rvest or httr to log in to non s
  • Api 网关:用于 Lambda 集成的 AWS 子域

    我正在尝试将我的 lambda 函数与 API 网关集成 该函数必须异步运行 因为它需要太长时间 我相信我必须选择 AWS 服务 并指定 Lambda 而不是选择 Lambda 集成类型 例如 this http docs aws amaz
  • callgrind:如何检查一行是否执行

    是否可以使用 callgrind 产生像 gcov lcov 给出的输出一样的输出 我正在阅读他们的文档 无法找到 callgrind annotate 的确切选项 这是不可能的 但 callgrind annotate 或 kcacheg
  • Web API 项目在部署时不会运行 - 无法加载文件或程序集“Newtonsoft.Json,版本=4.5.0.0”

    当我部署 MVC 5 WEB API 项目时 我不断收到此错误 无法加载文件或程序集 Newtonsoft Json 版本 4 5 0 0 Culture neutral PublicKeyToken 30ad4fe6b2a6aeed 或其
  • Jquery 并将事件绑定到 iframe

    我目前正在使用 jquery textselect 插件根据页面上任何位置的选择文本来触发警报 并且它可以很好地执行以下操作 document ready function document bind textselect function
  • cron 作业替代品?

    我正在安装 Boonex 的 Dolphin 7 它要求我设置一个每 1 分钟运行一次的 cron 作业 然而 我的托管提供商允许我至少每 30 分钟运行一次 crons 我使用过 CMS 它有一个替代品 一个替代 cron 的脚本 有没有
  • Winforms 组件的父级/所有者[重复]

    这个问题在这里已经有答案了 从嵌入表单中的自定义 Winforms 组件中 如何获取父 所有者控件 我有一个 IContainer 并且 Site 属性不为空 但我不知道如何到达 真正的 父级 这是后续这个问题 https stackove
  • MongoDb:如果不存在,则将元素添加到数组[重复]

    这个问题在这里已经有答案了 我正在使用 node js 和 Mongodb 我是新使用 Mongod 的 我有一个这样的文档 Tag name string videoIDs array 这个想法是 服务器接收一个像这样的 JSON JSO
  • FOR /F 命令循环中的错误级别返回意外结果

    我正在尝试记录输出net stop同时还捕捉其ERRORLEVEL 基于这个问题 https stackoverflow com questions 3088712 我在嵌套子例程中尝试了以下操作 set a loopIndex 0 for