Powershell可以整理时间

时间:2015-01-08 16:57:22

标签: powershell powershell-v3.0 powershell-remoting

运行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
    }
}

1 个答案:

答案 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
    }
}
  • 导航每台计算机并获取minidump文件数据(假设它存在)。
  • 对于每个文件,我们格式化创建数据,使其成为具有秒的日期。
  • 向该信息添加生成文件的计算机名称。

这将创建如下所示的输出

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轻松输出。