Powershell 对时间进行排序

Powershell to sort through times

运行 powershell 脚本时,我能够在我的网络上找到具有 BSOD 和小型转储文件的机器。在筛选所有数据时,我注意到许多工作站每天都在同一时间发生。有没有办法使用 powershell 对数据进行排序,以仅显示 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
    }
}

认为您可能需要更清楚地了解需要对数据做什么,但工作仍然是一样的。我认为您应该将所有结果捕获到一个对象中,您可以对其进行分组和排序

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

忽略用于此的错误数据样本,您可以看到它按小型转储的 "creation dates" 对对象进行分组。如果在给定日期的同一分钟发生跨系统的文件,它们将在此处分组。

在我们变得疯狂之前,您也可以对结果进行排序,因为这也会向您展示您甚至不需要用 CreationTime

做疯狂事情的​​关系
$results | Sort-Object Date

根据评论更新

因此,如果您想对信息进行报告,您可以像这样操纵结果。

$results | Group-Object Date | ForEach-Object{
    [pscustomobject]@{
        Time = $_.Name
        Computers = $_.Group.Computer -join ";"
    }
}

每次(到分钟)发生 BSOD 时都会输出。如果有多台计算机,则它们将在参数 Computers 中以分号分隔。如果你愿意,你可以用 Export-CSV 轻松输出它。