运行powershell脚本时,我能够在网络上找到具有BSOD且具有minidump文件的计算机。除草所有数据时,我注意到许多工作站每天都在同一时间发生。有没有办法使用PowerShell对数据进行排序,只显示每天bsod时间相同的工作站?
我用来检测有bsod的机器的脚本。
$Computers = get-content "C:\users\mike\Computerlist.txt"
$OutFile = "C:\users\mike\Results.txt"
#Erase an existing output file so as not to duplicate data
out-file -filepath $OutFile
foreach ($Computer in $Computers)
{
if (test-path \\$computer\c$\Windows\Minidump) #test to make sure the file exists
{
#Get the CreationTime value from the file
$FileDate = (Get-ChildItem \\$computer\c$\Windows\Minidump).CreationTime
#Write the computer name and File date separated by a unique character
"$Computer | $FileDate" | out-file -FilePath $OutFile -Append
}
}
答案 0 :(得分:2)
认为您可能需要更清楚地了解数据需要做什么,但工作仍然相同。我认为您应该将所有结果捕获到一个可以对其进行分组和排序的对象
$results = @() # Capture all the data here.
ForEach ($Computer in $Computers){
if (Test-Path "\\$computer\c$\Windows\Minidump") #test to make sure the file exists
{
#Get the CreationTime value from the file
$fileData = Get-ChildItem "\\$computer\c$\Windows\Minidump" |
Select Name,@{L="Date";E={Get-Date($_.CreationTime) -Format "ddMMyyyyHHmm"}} |
Add-Member -MemberType NoteProperty -Name "Computer" -Value $computer -PassThru
$results += $fileData
}
}
这将创建如下所示的输出
Name Date Computer
---- ---- --------
010615-28142-01.dmp 060120151213 awesome
121714-34179-01.dmp 171220141310 awesome
121714-36441-01.dmp 171220141310 awesome
010615-28142-01.dmp 080120151307 C3959
121714-34179-01.dmp 080120151308 C3959
121714-36441-01.dmp 080120151308 C3959
因此我们有文件名,文件的格式化时间戳以及这些文件的关联计算机。现在我们可以使用Group-Object
来收集和排序这些数据。 (这是您可能需要与您的意图联系的部分)
$results | Group-Object date
Count Name Group
----- ---- -----
1 060120151213 {@{Name=010615-28142-01.dmp; Date=060120151213; Computer=awesome}}
2 171220141310 {@{Name=121714-34179-01.dmp; Date=171220141310; Computer=awesome}, @{Name=121714-36441-01.dmp; Date=171220141310; Computer...
1 080120151307 {@{Name=010615-28142-01.dmp; Date=080120151307; Computer=C3959}}
2 080120151308 {@{Name=121714-34179-01.dmp; Date=080120151308; Computer=C3959}, @{Name=121714-36441-01.dmp; Date=080120151308; Computer=C...
忽略用于此的错误数据样本,您可以看到它按照minidump的“创建日期”对对象进行分组。如果跨系统的文件发生在某一天的同一分钟,则会在此处进行分组。
在我们开始疯狂之前,您也可以对结果进行排序,因为这也会向您显示您甚至需要使用CreationTime
$results | Sort-Object Date
从评论中更新
因此,如果您想要对信息进行报告,您可以像这样操纵结果。
$results | Group-Object Date | ForEach-Object{
[pscustomobject]@{
Time = $_.Name
Computers = $_.Group.Computer -join ";"
}
}
这将输出BSOD发生的每次(到分钟)。如果有多台计算机,则它们将在参数Computers
中以分号分隔。如果您愿意,可以使用Export-CSV
轻松输出。