1

5 分間隔で実行するために AHK に割り当てたいジョブがあります。txt ファイルの内容を確認する必要があります。たとえば、c:\test.txt とします。このファイルには、次の形式の任意の数の行を含めることができます。

prog 1
prog 2
prog 3
  ...
prog N

他のテキストを含む行の間。

私の目的は、最後の行の prog という単語の直後の番号を AHK に伝えることです。これは、これらの行がこのファイル内で数字の順番になっているため、リスト内で最大の番号です。

私の壮大なアイデアは、「prog 1」から「prog N」までの行の存在を確認することです。ここで、N は 20 未満の数字で、cmd ウィンドウで一連の検索コマンドを使用して、エラーレベルを取得し、エラーレベルが 1 に達したときに、最後に正常に実行された find コマンドであるため、目的の変数をループ インデックスの値から 1 を引いた値に設定します。

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 に渡すことです。

これが私のコードです:(このコードは、AHKフォーラムから入手したfindコマンドのテスト専用です)

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

このコードを実行すると、"prog 4" 行があるかどうかに関係なく、メッセージ ボックスには常に値 "0" が表示されます。

コマンドRunをRunWaitに置き換えると、エラーレベルが期待どおりに表示されますが、その場合、自動化プロセスでグリッチが発生します.cmdプロンプトを手動で閉じることを期待しています。コマンド RunWait の。

どうすればこのハードルを乗り越えることができますか? 機能全体を dos バッチ ファイルにロードし、最後にバッチ ファイルから数値出力を取得することにオープンですが、AHK を使用したプログラミングは、DOS バッチ プログラミングよりもはるかに簡単で理解しやすいことに気付きました。したがって、私の好みは AHK スクリプト側です。

ありがとうございました

4

3 に答える 3

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%
于 2013-11-05T11:17:31.277 に答える
1

RegEx を使用して最後の項目を抽出します。

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

算術/文字列操作に関しては、ほとんどの場合 AutoHotkey で十分です。このような単純なことのために他のアプリケーションを呼び出すのは、やり過ぎであり、速度が遅くなる可能性があります。

正規表現の説明:

  • s)は、ピリオド ( .\r ) が改行 ( and/or )を含む各文字と一致することを決定します\n。デフォルトでは、最初の改行で停止します。正規表現オプションを参照してください。
  • .*何にでも合うスタンダードな柄です。パターンがまだ満たされている限り、可能な限り消費するため、文字列の最後の項目を見つけることが重要です。つまり、最後の まですべてを破棄しますprog n。これはまさに私たちが望んでいることです。RegEx リファレンスの Greed を参照してください。
  • (\d+)2 つのことを行います: 1) 任意の整数のシーケンスを検索します。2) サブパターンを作成し、後で明示的にアクセスできるように番号を保存します。

出力変数 (ここでは: num) は、一致したサブパターンと一致したパターン全体を含む疑似配列になります。印刷%num%すると、最後のprog n. %num1%には、最大の最初のサブパターンが含まれますn

于 2013-11-07T07:43:44.417 に答える