Powershell来整理时间

Powershell来整理时间,powershell,powershell-3.0,powershell-remoting,Powershell,Powershell 3.0,Powershell Remoting,运行powershell脚本时,我能够在网络上找到具有BSOD和小型转储文件的计算机。在清除所有数据时,我注意到许多工作站每天都有同一时间发生这种情况。是否有办法使用powershell对数据进行排序,以仅显示bsod时间每天相同的工作站 我用来检测具有bsod的机器的脚本 $Computers=获取内容“C:\users\mike\Computerlist.txt” $OutFile=“C:\users\mike\Results.txt” #擦除现有的输出文件,以免复制数据 out file-

运行powershell脚本时,我能够在网络上找到具有BSOD和小型转储文件的计算机。在清除所有数据时,我注意到许多工作站每天都有同一时间发生这种情况。是否有办法使用powershell对数据进行排序,以仅显示bsod时间每天相同的工作站

我用来检测具有bsod的机器的脚本

$Computers=获取内容“C:\users\mike\Computerlist.txt”
$OutFile=“C:\users\mike\Results.txt”
#擦除现有的输出文件,以免复制数据
out file-文件路径$OutFile
foreach($Computers in$Computers)
{
if(测试路径\\$computer\c$\Windows\Minidump)#测试以确保文件存在
{
#从文件中获取CreationTime值
$FileDate=(Get ChildItem\\$computer\c$\Windows\Minidump)。CreationTime
#写入计算机名和文件日期,并用唯一字符分隔
“$Computer |$FileDate”|输出文件-文件路径$OutFile-追加
}
}

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

$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
来收集和排序这些数据。(这是您可能需要与您的意图相呼应的部分)

忽略用于此操作的坏数据示例,您可以看到它根据小转储的“创建日期”对对象进行分组。如果在某一天的同一分钟内发生了跨系统的文件,则这些文件将在此处分组

在我们开始疯狂之前,你也可以对结果进行排序,因为这也会显示出你甚至不需要用
CreationTime

$results | Sort-Object Date
根据评论更新

所以,如果你想做一个信息报告,你可以像这样操纵结果

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

它将在每次(每分钟)发生BSOD时输出。如果有多台计算机,则它们将在参数
computers
中以分号分隔。如果您愿意,您可以使用导出CSV轻松地输出此信息。

我认为您需要更具体地说明时间戳的粒度。这些文件不太可能每天都有相同的时间戳,最短可达毫秒。老实说,小时和分钟已经接近我所需要的时间了。
$Computer |$FileDate出了点问题“
。你有一个报价问题。我试图修复它,假设它是一个拼写错误,但我不确定它的意图是什么。我的最终意图是能够与软件开发人员一起提供这一点,以提供另一个具有公共分母的数据字符串。背景故事是,我们有一个为我们公司开发的软件,并在一个小样本中进行了测试,然后给出了将其发送给整个企业的指令,而无需进行彻底的测试运行。自部署该软件以来,我们企业20000台工作站中的约1/3已多次BSOD。我已经向他们提供了数字计数,但他们需要关于哪些工作站每天同时进行计数的详细信息。
$results | Group-Object Date | ForEach-Object{
    [pscustomobject]@{
        Time = $_.Name
        Computers = $_.Group.Computer -join ";"
    }
}