Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用PowerShell按日期对CSV输入数据进行排序_Powershell - Fatal编程技术网

使用PowerShell按日期对CSV输入数据进行排序

使用PowerShell按日期对CSV输入数据进行排序,powershell,Powershell,我正在尝试使用PowerShell对目录中的CSV文件集合进行排序,然后希望将结果导出到新的单个CSV文件 我的代码执行无误,但结果排序不正确 我的源数据如下所示(这是用于测试的示例): 我的结果如下所示: "TimeCreated","TargetUserSID","UserName","Domain","Message","Remark" "01.12.2017 11:39:17","","User123","tetslab.internal","Ein Konto wurde erfolg

我正在尝试使用PowerShell对目录中的CSV文件集合进行排序,然后希望将结果导出到新的单个CSV文件

我的代码执行无误,但结果排序不正确

我的源数据如下所示(这是用于测试的示例):

我的结果如下所示:

"TimeCreated","TargetUserSID","UserName","Domain","Message","Remark"
"01.12.2017 11:39:17","","User123","tetslab.internal","Ein Konto wurde erfolgreich angemeldet","Interactive (logon at keyboard and screen of system)"
"01.12.2017 11:39:17","","User123","tetslab.internal","Ein Konto wurde erfolgreich angemeldet","Interactive (logon at keyboard and screen of system)"
"04.12.2017 10:20:28","","Admin","TestClientWin7","Fehler beim Anmelden eines Kontos","Failed Login !"
"04.12.2017 10:22:38","","Admin","TestClientWin7","Ein Konto wurde erfolgreich angemeldet","Interactive (logon at keyboard and screen of system)"
"04.12.2017 10:22:38","","Admin","TestClientWin7","Ein Konto wurde erfolgreich angemeldet","Interactive (logon at keyboard and screen of system)"
"04.12.2017 10:22:44","","Admin","TestClientWin7","Ein Konto wurde erfolgreich angemeldet","Interactive (logon at keyboard and screen of system)"
"04.12.2017 10:22:44","","Admin","TestClientWin7","Ein Konto wurde erfolgreich angemeldet","Interactive (logon at keyboard and screen of system)"
"04.12.2017 10:23:14","S-1-5-21-66666666-777777777-888888888-99999","Admin","TestClientWin7","Benutzerinitiierte Abmeldung","User initiated Logoff."
"04.12.2017 10:23:20","S-1-5-21-964984727-670836246-1844936127-10903","User123","tetslab.internal","Benutzerinitiierte Abmeldung","User initiated Logoff."
"04.12.2017 10:25:35","","User123","tetslab.internal","Ein Konto wurde erfolgreich angemeldet","Interactive (logon at keyboard and screen of system)"
"04.12.2017 10:25:35","","User123","tetslab.internal","Ein Konto wurde erfolgreich angemeldet","Interactive (logon at keyboard and screen of system)"
"04.12.2017 10:27:27","S-1-5-21-964984727-670836246-1844936127-10903","User123","tetslab.internal","Benutzerinitiierte Abmeldung","User initiated Logoff."
"04.12.2017 10:29:49","","User123","tetslab.internal","Ein Konto wurde erfolgreich angemeldet","Interactive (logon at keyboard and screen of system)"
"04.12.2017 10:29:49","","User123","tetslab.internal","Ein Konto wurde erfolgreich angemeldet","Interactive (logon at keyboard and screen of system)"
"04.12.2017 13:56:34","","User123","tetslab.internal","Fehler beim Anmelden eines Kontos","Failed Login !"
"04.12.2017 13:56:48","","User123","tetslab.internal","Ein Konto wurde erfolgreich angemeldet","Workstation unlocked"
"04.12.2017 13:56:48","","User123","tetslab.internal","Ein Konto wurde erfolgreich angemeldet","Workstation unlocked"
"04.12.2017 13:56:56","S-1-5-21-964984727-670836246-1844936127-10903","User123","tetslab.internal","Benutzerinitiierte Abmeldung","User initiated Logoff."
"08.11.2017 09:23:14","","","","Fehler beim Anmelden eines Kontos","Failed Login !"
"08.11.2017 09:24:58","","","","Fehler beim Anmelden eines Kontos","Failed Login !"
这是我的代码:

$SortingCSV = @()
Get-ChildItem "c:\temp\*.csv" | ForEach-Object{
    $SortingCSV += Import-Csv $_
}
$SortingCSV | Sort-Object TimeCreated | Export-Csv -NoTypeInformation -Force -Encoding UTF8 "c:\temp\sorted.csv"

出现此问题的原因是TimeCreated列按字母顺序排序,因为它被解释为字符串值。处理此问题的一种方法是将其转换为DateTime对象。可以在
Select Object
cmdlet中使用计算属性执行此操作:

$SortingCSV | Select -ExcludeProperty TimeCreated @{N='TimeCreated';E={Get-Date $_.TimeCreated}},* | Sort-Object TimeCreated | Export-CSV ..

上面排除了TimeCreated属性byt,然后使用
Get Date
为其包含的字符串值返回一个日期对象,以相同的名称重新创建该属性。

从CSV导入的字段是字符串,因此它们是按字符串顺序排序的,而不是按日期顺序排序的,因此排序绝对正确,只是不是你所期望的。您需要为排序对象计算一个适当的
DateTime
值,以便按日期顺序对行进行排序。我还建议不要在循环中附加到数组

$pattern = 'dd\.MM\.yyyy HH:mm:ss'
$culture = [Globalization.CultureInfo]::InvariantCulture

Get-ChildItem 'C:\temp\*.csv' |
    ForEach-Object { Import-Csv $_.FullName } |
    Sort-Object { [DateTime]::ParseExact($_.TimeCreated, $pattern, $culture) } |
    Export-Csv 'C:\temp\sorted.csv' -Encoding UTF8 -NoType -Force

它看起来像是按字母顺序排序的,您需要将timecreated转换为datetime对象。这也会起作用,但缺点是,
timecreated
列的格式可能会意外更改(如果区域设置指定的日期/时间格式与输入数据中的格式不同)。是的,请注意日期的区域差异,这取决于脚本运行的位置。在这方面,Ansgar的答案更好,因为它明确了预期的日期模式。感谢您的贡献。优秀的解决方案和描述。
$pattern = 'dd\.MM\.yyyy HH:mm:ss'
$culture = [Globalization.CultureInfo]::InvariantCulture

Get-ChildItem 'C:\temp\*.csv' |
    ForEach-Object { Import-Csv $_.FullName } |
    Sort-Object { [DateTime]::ParseExact($_.TimeCreated, $pattern, $culture) } |
    Export-Csv 'C:\temp\sorted.csv' -Encoding UTF8 -NoType -Force