![批处理文件从日志文件行中间提取文本](https://linux22.com/image/1605670/%E6%89%B9%E5%A4%84%E7%90%86%E6%96%87%E4%BB%B6%E4%BB%8E%E6%97%A5%E5%BF%97%E6%96%87%E4%BB%B6%E8%A1%8C%E4%B8%AD%E9%97%B4%E6%8F%90%E5%8F%96%E6%96%87%E6%9C%AC.png)
在 UTF-16LE 日志文件中,我有如下行:
[128 characters]APP_NAME=Samsung Magician&APP_KEY=[additional characters]&APP_FLAG=[single digit]
我想要 APP_FLAG=0 的每一行中的 APP_NAME(例如 Samsung Magician)。我可以这样识别这些行:
FIND "APP_FLAG=0" "C:\[directory]\logfile.log" > D:\Progs1.txt
下一步不太清楚。我无法从 Progs1.txt 中这些行的中间提取所需的文本。在 Excel 中很容易,但这次我想学习如何自动化这个过程。
我认为下一步是丢弃 Progs1.txt 中每行的前 128 + 9 个字符。理想情况下,我不会依赖于始终会有 128 个前导字符的假设。相反,我会使用 APP_NAME 作为德利姆在 FOR 循环中。但似乎不允许为此目的使用多个字符。
我还没有想出最后一步,丢弃以 &APP_KEY 开头的文本,只留下应用程序名称作为最终输出。如果我可以假设每行中有固定数量的下划线,也许我可以使用类似分割字符串代码。但我不知道每行所用的下划线数量是否不同。
这里的问题是,什么命令最适合生成一个 Progs2.txt 输出文件,其中每行都以应用程序名称开头(例如,Samsung Magician)?
答案1
(我不会举报这个问题,因为我不像 Stack Exchange 上的大多数人那样是个混蛋举报者,但为了将来参考,像这样的问题应该发布在堆栈溢出。
我以前确实遇到过和你一样的问题,但不幸的是(据我所知),你想要的东西在 Batch 中无法实现。不过,我有一个解决方法。
Batch 更适合在 CMD 中运行,而 Visual Basic Script 更适合在 Powershell 中运行。Powershell 能够解决很多更复杂的问题,但由于两者几乎是同一件事,因此它们可以协同工作,这就是我在这里所做的。
Const ForReading = 1
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFile = objFSO.OpenTextFile("<insert-txt-file-here>", ForReading)
strSearchString = objFile.ReadAll
objFile.Close
Set objRegEx = CreateObject("VBScript.RegExp")
objRegEx.Global = True
objRegEx.Pattern = "<insert-pattern-here>"
Set colMatches = objRegEx.Execute(strSearchString)
Const ForWriting = 2
Set obj = CreateObject("Scripting.FileSystemObject")
Set obj1 = obj.OpenTextFile("<insert-output-file-here>", ForWriting)
If colMatches.Count > 0 Then
For Each strMatch in colMatches
obj1.WriteLine(str.Match.Value)
Next
End If
obj1.Close
上面的代码将从文本文件中提取任何文本部分,只要文本与其模式(在此处插入模式)匹配即可。例如,如果我想搜索文本文件中出现的“红色美洲虎”的每次时间,我会插入objRegEx.Pattern = "red jaguar"
。模式可能比这更复杂,更多信息这里。
我知道上述代码过去对我来说是有效的,但 Visual Basic Script 因不能普遍使用而臭名昭著,因此您可能需要稍微修改一下代码。我会自己测试一下,但我的台式机现在坏了,所以我只能使用装有 Linux 的笔记本电脑,而 Linux 无法运行 Visual Basic Script。另外,如果您还不知道,必须将脚本保存为“.vbs”文件。
无论如何,如果您有某种“主程序”或在批处理中运行的东西,那么您可以告诉批处理文件使用命令启动 Visual Basic 脚本START /WAIT
,让脚本运行,然后使用此代码导入它的输出:for /f "Delims=" %%a in (<insert-vbs-output-here>) do (set output=%%a)
。
希望这可以帮助。
编辑:我忘了提到 Visual Basic 脚本的输出文本文件必须必须提供,才能使其正常工作。如果希望每次运行脚本时都有一个新的输出文本文件,那么在批处理文件中启动脚本之前,请使用以下命令创建文本文件:echo. > output.txt
,然后在脚本运行并导入其输出后,使用此命令删除文本文件:DEL output.txt
。但是,如果您正在调试,最好不要删除输出,这样您就可以看到它输出的内容。