我有一份工作,我想把它分配给AHK,以5分钟的间隔为我跑。 它需要检查txt文件的内容,比如c:\ test.txt。 此文件可以包含以下格式的任意数量的行:
prog 1
prog 2
prog 3
...
prog N
包含其他文本的行。
我的目的是告诉AHK最后一行后面的数字,这是列表中最大的数字,因为这些行在此文件中以数字顺序排列。
我的宏伟想法是检查从“prog 1”到“prog N”的行的存在,其中N是20以下的数字,在cmd窗口上使用一系列find命令,得到错误级别,当错误级别时点击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%中的值。我知道这可能不是实现这一目标的最优雅的解决方案,但是如果每天在一台空闲的笔记本电脑上进行几次运行,我可以承担性能损失。
到目前为止,我仍然坚持这个想法的基本组成部分:查找命令并将其生成的错误级别传递回AHK
这是我的代码:(此代码仅用于测试find命令,我从AHK论坛获得)
Run %COMSPEC% /K type c:\users\me\test.txt | find "prog 4", , max
msgbox %ErrorLevel%
return
当这段代码运行时,无论“prog 4”行是否存在,消息框始终显示值“0”。
当我用RunWait替换命令Run时,错误级别会显示为人们期望的,但在这种情况下,我的自动化过程会遇到一个小问题:期望手动关闭cmd提示符,我假设* feature“of命令RunWait的等待部分。
我怎样才能克服这个障碍?我愿意将整个功能加载到dos批处理文件并在最后从批处理文件中获取数字输出,但我意识到,使用AHK编程比DOS批处理编程更容易理解和理解。所以,我的偏好是在AHK脚本方面。
谢谢
答案 0 :(得分:1)
如果你想在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
编辑以始终获得最高价值
答案 1 :(得分:1)
让系统为您获取价值。
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%
答案 2 :(得分:1)
我会使用RegEx来提取最后一项:
FileRead, cont, test.txt
RegExMatch(cont, "s).*prog (\d+)", num)
msgbox, Hightest number: %num1%
对于算术/字符串操作,大多数时候AutoHotkey应该足够了。将这样的简单事情称为其他应用程序是一种过度杀伤,很可能会让你失望。
RegEx的说明:
s)
确定句点(。)将匹配每个字符,包括任何换行符(\r
和/或\n
)。默认情况下,它会在第一个换行符处停止。见RegEx options。.*
是一种可以匹配任何内容的标准模式。找到字符串中的最后一项是关键,因为只要模式仍然满足,它将尽可能多地消耗。换句话说,它将丢弃所有内容,直到最后prog n
,这正是我们想要的。见Greed in the RegEx reference。(\d+)
做两件事:1)它会找到任何整数序列2)它将创建一个子模式并存储我们可以在以后明确访问它的数字。输出var(此处为:num
)将是一个伪数组,包含任何匹配的子模式以及匹配的整个模式。打印%num%
将显示几乎整个文件,直到最后prog n
。 %num1%
将包含第一个子模式,这是最大的n
。