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