2

小さな問題が数日間私を悩ませ続けます。* .exeバイナリからregexpで定義できる文字列、「1.01.01.00T123」などのテキストを環境変数に抽出して、さらに使用しようとしています。
私は文字列を見つけました

findstr /i [0-9]\.[0-9][0-9]\.[0-9][0-9]\.[0-9][0-9][T][0-9][0-9][0-9] name.exe>outp.bin

今では少し小さいバイナリ、おそらく200バイトの私の文字列です。次に、「for / f」でfindstrの出力を使用しようとしましたが、バイナリにどの区切り文字を使用すればよいか、何も保証されません。ドットやブランクでさえ行き来することができます。
何かのようなもの:

for /f "tokens=1,2,3,4* delims=^." %%a in ('findstr /i [0-9]\.[0-9][0-9]\.[0-9][0-9]\.[0-9][0-9]T[0-9][0-9][0-9] name.exe') do (
echo %%a
echo %%b
echo %%c
echo %%d
)

途中でしか機能しません。最初の部分は長すぎます。最後の部分「xxTxxx」は、この定義ではトークンではありません。ドットに加えて、私の文字列だけでなく、バ​​イナリの内部でも発生する可能性があります。
常に最初のバイトをカットして、ループ内のoutp.binを短くしてから、文字列がoutp.binの先頭にあるかどうかを確認するようなものを考えました。しかし、これを行う方法はまだ見つかりません。出来ますか?
正規表現の結果を変数にコピーするだけの方法はありますか?
標準のコマンドシェルで正規表現の魔法のコマンドを見逃したことを願っています。

4

1 に答える 1

1

バイナリにnulバイトが含まれている可能性があり、バッチがnullバイトを処理できないため、純粋なバッチで必要な処理を実行することはほぼ不可能です。ただし、この問題は、VBSまたはJScriptと正規表現を使用して簡単に解決できます。

これは非常に大雑把なVBSソリューションであり、改善の余地がたくさんあります。しかし、それは機能します。

findStr.vbs

Set myRegExp = New RegExp
myRegExp.IgnoreCase = True
myRegExp.Global = True
myRegExp.Pattern = "\d\.\d\d\.\d\d\.\d\dT\d\d\d"
Set matches = myRegExp.Execute(WScript.StdIn.ReadAll())
For Each match In matches
  WScript.StdOut.WriteLine(match.value)
Next

CSCRIPTを使用してスクリプトを呼び出し、入力をexeファイルにリダイレクトします。

<name.exe cscript //nologo findStr.vbs

バッチを使用して、FOR/Fを介して結果を処理できます。

for /f "delims=" %%A in ('^<name.exe cscript //nologo findStr.vbs') do echo %%A


更新-2015-08-26

これは、 JREPL.BATを使用して簡単に解決できます。これは、XP以降の任意のWindowsマシンでネイティブに実行される純粋なスクリプトベースの正規表現処理ユーティリティ(ハイブリッドJScript /バッチ)です。完全なドキュメントがスクリプトに埋め込まれています。

以下に、ファイルで見つかった値を簡単に示します。/Mexeでnullバイトが発生する可能性があるため、このオプションが必要であることに注意してください。

call jrepl "\d\.\d\d\.\d\d\.\d\dT\d\d\d" $0 /jmatch /m /f name.exe

変数の値(または複数回出現する場合は最後の値)をキャプチャするには:

for %%A in (
  'jrepl "\d\.\d\d\.\d\d\.\d\dT\d\d\d" $0 /jmatch /m /f name.exe'
) do set "str=%%A"
于 2012-11-09T18:28:15.293 に答える