用于从不带扩展名的文件中提取数据的 Powershell 脚本

Powershell script to extract data from file without an extension

目前正在每小时执行一个批处理文件以启动我们的测试软件并将结果导出到日志文件中。日志文件是通用文件类型,没有文件扩展名。

我目前正在 运行 三行 powershell 手动从日志文件中提取指定的行并将它们导出到一个大文本文件中。第一种是更改到保存日志的目录,第二种是抓取当前目录并将其添加到文件中,第三种是从文件中抓取选定的文本并将其附加到与目录相同的输出文件中。行数:

  1. cd directorypath
  2. (Get-Item -Path ".\" -Verbose).FullName | Add-Content c:\TestLogs\LogData.txt
  3. Get-Content -Path .\"{0CF215CA-7E09-4280-A792-6184B9366FCA}" | Select-String Last | Add-Content c:\TestLogs\LogData.txt

对于第 1 行,目录路径将始终更改。日志文件存储在 C:\TestLogs 中。在该目录中是具有以下格式示例的子文件夹:Log072020170800

在第 3 行中,数据包含在名为 {0CF215CA-7E09-4280-A792-6184B9366FCA} 的文件中。此文件名将始终更改,但将采用相同的 8-4-4-4-12 (GUID) 格式。此文件名没有扩展名,目录中还有两个其他文件具有相同的文件名结构。然而,我希望抓取的文件大小通常在 60kb 左右,而其他文件则在 2-5kb 之间。

我想自动执行 运行 这三个 PowerShell 行的过程,但我不确定最佳操作方案。任何建议,将不胜感激。

假定这些文件始终包含在花括号中,这样的事情应该可以解决问题。否则,您可以修改路径上的通配符搜索以更好地匹配您要执行的操作

$directories = get-childitem directorypath
foreach ($directory in $directories){
Get-item -path $directory.fullname | add-content C:\TestLogs\LogData.txt
get-content -path "{*}" | Select-String Last | Add-Content c:\TestLogs\LogData.txt}

鉴于您需要对具有相同 GUID 命名方案的文件进行排序,您将需要确定排序的基础。理想情况下,文件内部或文件的某些内容可以肯定地告诉您。像修改时间或修改用户这样的想法可能值得检查一下,看看它们是否适合你。由于您提供了近似文件大小作为决定因素,我们可以使用它。

get-childitem "C:\YourPath" | where { $_.length -gt 10kb -and $_.name -like "{*}" } | Select-String Last | Add-Content c:\YourOutput.txt

我会把 10kb 提高到你认为可以通过这种方法减少误报的最高点。

您可以在日志文件夹的顶层执行此操作,假设所有内容都在一个父项下: get-childitem "C:\YourPath" -Recurse | where { $_.length -gt 10kb -and $_.name -like "{*}" } | Select-String Last | Add-Content c:\YourOutput.txt

或者将第一个版本包装在您传入目录的 foreach 循环中。

我想这会对你有所帮助!

让我们为输出数据设置一个位置

$CollectedInfo = 'C:\Testlogs\Logdata.txt'

让我们定义要在何处搜索子文件夹。

$MainLogLocation = 'C:\TestLogs'

现在我们知道在哪里可以找到可能的文件夹,让我们缩小范围。您可能想使用 LastAccessTimeLastWriteTime.

$Newest = Get-ChildItem -Path $MainLogLocation | Sort-Object LastWriteTime -Descending | Select-Object -First 1

太好了,现在我们知道最新的 subfolder/batch。让我们找到其中的文件是一个 GUID,同时,让我们根据需要选择最大的文件。

$WorkFile = Get-ChildItem $Newest.FullName | Where-Object {$_.Name -match "^(\{){0,1}[0-9a-fA-F]{8}\-[0-9a-fA-F]{4}\-[0-9a-fA-F]{4}\-[0-9a-fA-F]{4}\-[0-9a-fA-F]{12}(\}){0,1}$"} | Sort-Object Length -Descending | Select-Object -First 1

现在我们想在日志中添加一行,指示我们从哪个文件夹中提取数据。

Add-Content -Value $WorkFile.Directory $CollectedInfo

最后,我们查看文件,搜索我们想要的任何行,并将其附加到输出文件 $CollectedInfo。这可能是 运行 几次以获得不同的信息,或者设置为使用数组和 ForEach 循环。

Get-Content -Path $WorkFile.FullName | Select-String 'STUFF I NEED' | Add-Content $CollectedInfo
Get-Content -Path $WorkFile.FullName | Select-String 'OTHER STUFF I NEED' | Add-Content $CollectedInfo