Powershell读取一组日志文件,将计算机添加到ActiveDirectory中的组并导出CSV

Powershell读取一组日志文件,将计算机添加到ActiveDirectory中的组并导出CSV,powershell,active-directory,Powershell,Active Directory,在Windows服务器上,每天都会启动一项任务,以更正特定记录的DNS权限,并将其记录到CSV文件日期ComputerName中 这个脚本运行了一年,现在有很多日志文件 我需要能够: 读取所有日志文件 将每台计算机添加到广告组 计算计算机从一开始记录的次数 将此文件导出到另一个csv文件 导出一种摘要 在原始脚本末尾启动此脚本 我不能修改原来的脚本,它每天早上7点启动,每10分钟持续12小时。目前,我必须处理同一目录中的日志文件.CSV 脚本将内容附加到CSV文件,如下所示: 20-06-201

在Windows服务器上,每天都会启动一项任务,以更正特定记录的DNS权限,并将其记录到CSV文件日期ComputerName中

这个脚本运行了一年,现在有很多日志文件

我需要能够:

读取所有日志文件 将每台计算机添加到广告组 计算计算机从一开始记录的次数 将此文件导出到另一个csv文件 导出一种摘要 在原始脚本末尾启动此脚本 我不能修改原来的脚本,它每天早上7点启动,每10分钟持续12小时。目前,我必须处理同一目录中的日志文件.CSV

脚本将内容附加到CSV文件,如下所示:

20-06-2019-08:00:03,PO038281
20-06-2019-08:10:03,PO042080
20-06-2019-08:20:05,PC040752
20-06-2019-08:20:05,PO041927
20-06-2019-08:20:05,PO047187
20-06-2019-08:30:05,PO046931
...
$tagfile=获取日期-格式为ddMMyyyy $logfile=C:\Logs\Taches Planifiées\Correctif权限注册DNS\correctionDNS\uU$tagfile.csv 一些代码 $timestamp,$pcname |添加内容-路径$logfile 每个CSV文件如下所示:

20-06-2019-08:00:03,PO038281
20-06-2019-08:10:03,PO042080
20-06-2019-08:20:05,PC040752
20-06-2019-08:20:05,PO041927
20-06-2019-08:20:05,PO047187
20-06-2019-08:30:05,PO046931
...
我在每个CSV文件上写了一个脚本,循环到

$Global:path = [System.IO.Path]::GetDirectoryName($myInvocation.MyCommand.Definition)
$objLogs = New-Object System.Collections.ArrayList
ForEach($file in (Get-ChildItem -Path $path | Where{$_.Name -like "CorrectionsDNS_*.csv"})){
    ForEach($line in Get-Content $file){
        $obj = New-Object PSObject
        $obj | add-member -MemberType NoteProperty -name "Date" -value $line.SubString(0,10)
        $obj | add-member -MemberType NoteProperty -name "Hour" -value ($line.Split("-")[3]).Split(",")[0]
        $obj | add-member -MemberType NoteProperty -name "Computer" -value ($line.Split("-")[3]).Split(",")[1]
        $objLogs += $obj
    }   
}
$csv = $path + "\" + (Get-Date).ToString("yyyy-MM-dd.HH") + "h" + (Get-Date).ToString("mm") + ".LogsDNS.csv"
$objLogs | Export-CSV -Path $csv -Delimiter ";" -Encoding UTF8 -NoTypeInformation
if ((Get-ADGroup -Identity "ErreurDNS") -eq $false){
    New-ADGroup -GroupCategory: "Security" -GroupScope: "Global" -Name "ErreurDNS" -Path: "OU=Ordinateurs,OU=Hotel du Departement,DC=cg53,DC=fr" -SamAccountName:"ErreurDNS"
}
ForEach ($member in ($objLogs.Computer | Group).Name){
    Add-ADGroupMember -Identity "ErreurDNS" -Members (Get-ADComputer $member) -ErrorAction Ignore
}
看来目标1、2和4都没问题。 以下是.CSV文件:

"Date";"Hour";"Computer"
"01-01-2019";"07:30:11";"PO042117"
"01-02-2019";"08:10:03";"PO042150"
"01-02-2019";"08:20:07";"PO042070"
"01-02-2019";"08:30:03";"PO041284"
...
但是如果可能的话,你能帮我实现目标3、5和6吗

我已尝试通过计算机对结果进行分组:

$objLogs.Computer | Group |选择名称、计数 但它是不可读的。一些计算机计算了好几条记录,但是这里没有更多的替换,或者他们在几周后就没有问题了,重新安装,替换

我如何写一个摘要,我可以很容易地看到计算机的DNS记录已被纠正,而不是每次导入我的CSV到Excel表

上周.csv

"";"Hour";"Computer"
"01-01-2019";"07:30:11";"PO042117"
"01-02-2019";"08:10:03";"PO042150"
"01-02-2019";"08:20:07";"PO042070"
"01-02-2019";"08:30:03";"PO041284"
...
LastMonth.csv,LastYear.csv

欢迎任何意见^^

提前谢谢。

根据我的评论

转换为[日期时间] 用计算机分组对象 评估日志中计算机的第一次、最后一次遭遇 使用导出csv输出统计信息或另存为另一个csv文件 基于对上述数据的一些添加的样本输出。日期时间格式符合我的区域设置

> . Q:\Test\2019\06\20\SO_56684868.ps1

Computer Count FirstEnc            LastEnc
-------- ----- --------            -------
PO038281     2 2019-05-20 08:00:03 2019-06-20 08:00:03
PO042080     2 2019-04-20 08:10:03 2019-06-20 08:10:03
PC040752     2 2019-03-20 08:20:05 2019-06-20 08:20:05
PO041927     2 2019-02-20 08:20:05 2019-06-20 08:20:05
PO047187     2 2019-01-20 08:20:05 2019-06-20 08:20:05
PO046931     2 2019-01-10 08:30:05 2019-06-20 08:30:05

我怎么能不能修改原始脚本和第6点匹配?顺便说一句,如果需要,我会导入Csv日志标题,并将datetime戳转换为[datetime]类型,而不是将其拆分为两个字段。另外,使用+=进行添加效率非常低,因为它每次都会重建数组。@LotPings原始脚本实际上在生产中使用。但我可以有效地处理一个副本,但它会更正DNS条目只是为了测试,我不想在生产中这样做。所以,我正在尝试另一个脚本,我将简单地调用try/catch a结束。。。非常感谢你的提示。它按预期工作,我可以根据需要排序!事实上,我只想在第一个脚本中将计算机添加到指定的组中,让我或同事启动.ps1以导出csv,并使用$stats | Out GridView直接显示它。