For loop 在windows批处理中从二进制文件中提取RegExp字符串

For loop 在windows批处理中从二进制文件中提取RegExp字符串,for-loop,batch-file,binary,cmd,findstr,For Loop,Batch File,Binary,Cmd,Findstr,一个小问题一直困扰着我好几天。我正在尝试从*.exe二进制文本(如“1.01.01.00T123”)中提取一个可以用regexp定义的字符串,以供进一步使用。 我找到了一根绳子 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的输出,但是我应该为二进制文件使用

一个小问题一直困扰着我好几天。我正在尝试从*.exe二进制文本(如“1.01.01.00T123”)中提取一个可以用regexp定义的字符串,以供进一步使用。
我找到了一根绳子

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的开头。但仍然没有找到这样做的方法。可能吗?
有没有办法把我的正则表达式结果复制到一个变量中就不那么复杂了?

我希望在一个标准的命令shell中遗漏了一些针对regexp的神奇命令。

使用纯批处理几乎不可能实现您想要的功能,因为您的二进制文件可能包含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
要捕获变量中的值(或最后一个值,如果有多次出现):


另一个选项可能是用于提取可打印字符并将其输出导入
findstr
@dbenham,非常感谢!我已经放弃了干净的shell脚本,你的vbs做得非常好!工作起来很有魅力,我将把vbs行打包到我的cmd脚本中,然后将>>回显一个临时vbs脚本文件,并对我讨厌的二进制文件进行处理。顺便说一句,你说的“几乎不可能”是什么意思@AnsgarWiechers,谢谢!请说,“使用字符串”是什么意思?进展如何?尽管如此,即使我只能显示可打印的字符,我也不能保证除了我的RegExp字符串之外还有一个结果,所以实际上。我唯一想到的是将我的二进制剪辑总是缩短一个字节,然后看看“findstr/b”是否带来任何积极的结果。如果是,则缩短其末端的剩余部分,然后使用“findstr/e”进行查看。但不知何故,我还没有找到削减一字节pro迭代的方法。@AnsgarWiechers,对不起,这对我来说不是一个很好的问题。:-)您发布了一个链接:-)我现在明白了。@sangesi-我所说的“几乎不可能”是指纯本机批处理可能实现,但这需要付出巨大的努力,需要大量的代码,而且可能会非常缓慢。我能想到的唯一可以处理nul字节的命令是CERTUTIL-DUMP和FC/B,但我不想在使用其他脚本语言时构建一个解决方案。
for /f "delims=" %%A in ('^<name.exe cscript //nologo findStr.vbs') do echo %%A
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"