Powershell脚本从文件中提取数据而不使用扩展名

时间:2017-07-20 18:51:38

标签: powershell batch-file dynamic automation extract

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

我目前正在手动运行三个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
  4. 对于第1行,目录路径将始终更改。日志文件存储在C:\ TestLogs中。在该目录中是子文件夹,其格式示例如下:Log072020170800

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

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

3 个答案:

答案 0 :(得分:0)

这样的事情可以做到这一点,假设这些文件总是用花括号括起来。否则,您可以修改路径上的通配符搜索,以更好地匹配您尝试执行的操作

$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}

答案 1 :(得分:0)

鉴于您需要使用相同的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循环中。

答案 2 :(得分:0)

我认为这会帮助你!

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

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

让我们定义我们将在哪里搜索子文件夹。

$MainLogLocation = 'C:\TestLogs'

现在我们知道在哪里寻找可能的文件夹,让我们缩小范围。您可能希望使用LastAccessTimeLastWriteTime

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

太好了,现在我们知道了最新的子文件夹/批处理。让我们找到其中的文件是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