【问题标题】:AutoHotKey:how to get the errorlevel of find command?AutoHotKey:如何获取 find 命令的错误级别?
【发布时间】:2014-12-07 04:06:41
【问题描述】:

我有一份工作,我想将它分配给 AHK,让我每隔 5 分钟运行一次。 它需要检查一个 txt 文件的内容,比如说 c:\test.txt。 该文件可以包含任意数量的行,格式为:

prog 1
prog 2
prog 3
  ...
prog N

在包含其他文本的行中。

我的目的是告诉 AHK 在 prog 之后的最后一行的数字,这是列表中最大的数字,因为这些行在此文件中以数字顺序出现。

我的宏伟想法是检查从“prog 1”到“prog N”的行是否存在,其中 N 是 20 以下的数字,使用 cmd 窗口上的一系列查找命令,获取错误级别,当错误级别点击 1,我会将我想要的变量设置为循环索引的值减 1,因为它是最后一次成功运行的 find 命令,因此

i=1
loop 20
{
  type c:\users\me\test.txt | find "prog "%i%
  if  %errorlevel% != 0 
  { 
     num := i-1
     ; exit the loop in some way here
  }
  else 
  {
     i := i+1
  }
 } ; end loop

此时,我感兴趣的只是存储在变量 %num% 中的值。我知道这可能不是完成此任务的最优雅的解决方案,但如果每天在闲置的笔记本电脑上运行几次,我可以承担性能损失。

到目前为止,我一直停留在这个想法的最基本组成部分:find 命令并将它生成的错误级别传递回 AHK

这是我的代码:(此代码仅用于测试 find 命令,我从 AHK 论坛获得)

Run %COMSPEC% /K type c:\users\me\test.txt | find "prog 4", , max
msgbox %ErrorLevel%
return

当这段代码运行时,无论“prog 4”行是否存在,消息框总是显示值“0”。

当我将命令 Run 替换为 RunWait 时,errorlevel 会按预期显示,但在这种情况下,我的自动化过程会出现故障:期望手动关闭 cmd 提示符,我假设它具有 *feature"命令 RunWait 的等待部分。

我怎样才能克服这个障碍?我愿意将整个功能加载到 dos 批处理文件并在最后从批处理文件中获取数字输出,但我开始意识到,使用 AHK 编程比 DOS 批处理编程更容易执行和理解。所以,我的偏好是在 AHK 脚本方面。

谢谢

【问题讨论】:

    标签: windows cmd autohotkey


    【解决方案1】:

    我只会使用 RegEx 来提取最后一项:

    FileRead, cont, test.txt
    RegExMatch(cont, "s).*prog (\d+)", num)
    msgbox, Hightest number: %num1%
    

    当涉及算术/字符串操作时,AutoHotkey 在大多数情况下应该足够了。为这样的简单事情调用其他应用程序有点矫枉过正,很可能会减慢您的速度。

    正则表达式的解释:

    • s) 确定句点 (.) 将匹配每个字符,包括任何换行符(\r 和/或 \n)。默认情况下,它将在第一个换行符处停止。见RegEx options
    • .* 是一个标准模式,可以匹配任何东西。它是找到我们字符串中最后一项的关键,因为只要仍然满足模式,它就会尽可能多地消耗。换句话说,它将丢弃所有内容,直到最后一个prog n,这正是我们想要的。见Greed in the RegEx reference
    • (\d+) 做了两件事:1) 它会找到任何整数序列 2) 它会创建一个子模式并将数字存储在我们以后可以显式访问的地方。

    输出变量(此处为:num)将是一个伪数组,其中包含任何匹配的子模式以及匹配的整个模式。打印%num% 将显示几乎整个文件,直到最后一个prog n%num1% 将包含第一个子模式,这是最大的n

    【讨论】:

    • 谢谢您.. 如果这可行,那将是上帝的恩赐。由于我的办公室笔记本电脑上没有 AHK,所以今晚我将首先对其进行测试
    • @Mel_Burslan 很好,虽然我不知道你在哪个时区;)
    • 抱歉回复晚了。生活有时会成为阻碍。你的 3 行代码运行良好,正是我想要的。谢谢
    • @Mel_Burslan 不客气。如果您告诉我您也了解了代码的作用,那将是更大的乐趣!
    • 我承认 RegexMatch 命令不是我自己能弄明白的,但我从你的命令中理解的是:(cont, "s) 构造在我身上丢失了,除了 cont 引用到从打开文件中读取的材料;然后 *prog 匹配我的搜索字符串中的 prog 短语;(\d+) 匹配一个或多个数字;找到的最终值分配给变量 %num%。以及 %num% 如何在 msgbox 命令中变为 %num1% 也丢失了我,但我正在感知和数组值,这是第一个值,其中 s) 可以被认为是“排序”。我是怎么做的?
    【解决方案2】:

    如果您想在 AutoHotkey 中完成所有这些操作,我会这样做

    FileRead, Content, C:\test.txt
    Loop, parse, Content, `n
    {
        RegExMatch(A_Loopfield, "(?i)(?<=prog\s)[\d]+", match)
        If (match > lastMatch)
            lastMatch := match
    }
    
    msgbox % lastMatch
    

    已编辑以始终获得最高价值

    【讨论】:

    • 不是真的.. 这对于获得一个特定的编序号很有用。我所追求的是最后和最大数量的 prog X 字符串。 “prog X”行以数字顺序出现,最多可以达到 20,但在任何 5 分钟间隔内,文件中的 prog 行数可以是 3 到 20 之间的任何值。我想找出最大的数字是多少prog X 行,在我的文件中。正如我最初的问题所表明的那样,我在同一个文件中有其他内容的行。我可以在从 1 到 20 的循环中使用你的构造作为 prog 索引,但听起来它太复杂了,以至于有点矫枉过正。
    • @Mel_Burslan 没有办法完全读取文件。我想象的最高效的方式是一次读取整个文件(不循环)。然后,您可以计算 prog 的出现次数或提取最后一次出现的次数。
    • @Mel_Burslan 我的理解是正确的,你想每 5 分钟获得一次文件中最高的 Prog X 吗?
    • @ElliotDeNolf 是的,您的理解是正确的。那5分钟没有任何问题。它可能会改变或可能是一个连续的循环。还不确定。当我执行我的 AHK 脚本时,我只需要在任何给定时间知道 X 的最大值。
    • 由于某种原因,这个脚本的最终形式不适合我。最后我得到一个空白的 msgbox。我认为这是因为 msgbox 对 % 的不同解释,但我尝试的不同迭代都没有奏效。
    【解决方案3】:

    让系统为你获取价值。

    RunWait,%comspec% /v:on /c "( for /f "tokens=2" `%f in ('findstr /b /r /c:"prog [0-9]+" c:\users\me\test.txt ') do set max=`%f ) & exit /b !max!",,UseErrorLevel
    MsgBox %ErrorLevel%
    

    【讨论】:

      猜你喜欢
      • 2016-01-06
      • 1970-01-01
      • 2021-11-12
      • 1970-01-01
      • 2023-04-06
      • 1970-01-01
      • 1970-01-01
      • 2017-04-14
      • 2021-02-27
      相关资源
      最近更新 更多