1

我编写了一个简单的 powershell 脚本,它递归地遍历文件树并以制表符分隔的形式返回每个节点的路径及其创建时间,这样我就可以将它写到一个文本文件中并使用它来进行统计分析:

echo "PATH  CREATEDATE"
get-childitem -recurse | foreach-object {
$filepath = $_.FullName
$datecreated = $_.CreationTime
echo "$filepath $datecreated"
} 

然而,一旦我这样做了,我注意到当我查看相同文件的相同属性时,由脚本生成的 CreationDate 时间正好比 Windows 资源管理器所说的早一小时。通过检查我的数据集的其余部分(以不同的格式记录周围的事件),很明显,我从 explorer 获得的结果是唯一符合整体叙述的结果,这让我相信 Powershell 有问题脚本,使其写出不正确的时间。有没有人知道为什么会这样?

问题背景:

我正在尝试纠正一些 XML 日志文件设计中的问题,这些文件在用户启动和停止使用应用程序时记录,而实际上应该记录用户通过工作流的不同阶段所花费的时间. 我找到了一种可能的方法来解决这个问题,方法是从用户与 XML 日志一起发送的一些备份文件中提取日期信息。备份是由我们的最终用户应用程序在用户在工作流的各个阶段之间转换的确切时刻生成的,因此我试图将这些文件的时间戳中的信息与原始 XML 日志的内容结合起来,以找出什么我想知道工作流程的步骤。

评论讨论中得出的观点总结:

  • 这些文件与我正在运行的脚本位于同一台机器上(不是网络存储)
  • 更正夏令时和时区提高了数据质量,但不是针对原始问题中提出的具体问题。
4

1 回答 1

0

我从未找到导致 powershell 与 explorer 的时间戳之间存在差异的最终技术原因,但我能够通过将我从 powershell 脚本中获得的所有时间戳减去一个小时来纠正它。然而,在这样做之后,我从 XML 日志文件中获得的时间戳与我使用 powershell 脚本从文件系统中提取的时间戳之间仍然存在很大的分歧。推断最终用户在生成文件时可能停留在同一时区,我编写了一个小算法来估计每个用户的时区,通过评估工作流和步骤中步骤 1 和步骤 2 之间的时间中位数2和3.如果用户的时区有问题,这两个时间跨度之一将是负数(因为估计了步骤 2 事件的时间,并且从 XML 日志中知道了步骤 1 和 3 事件的时间。)然后我将正值向下舍入到最接近的小时并应用该小时数作为该用户步骤 2 次的偏移量。总的来说,这使我的数据集中的不良数据量从 20% 下降到 0.01%,所以我对结果很满意。

如果有人需要它,这是我用来在时间戳中制作小时偏移的代码(不是 powershell 代码,这是在处理另一部分数据处理的 C# 脚本中):

    DateTime step2time = DateTime.Parse(LastModifyDate);
    TimeSpan shenanigansCorrection = new TimeSpan(step2time.Hour-1,step2time.Minute,step2time.Second); 
    step2time= step2time.Date + shenanigansCorrection;

重新定义变量的原因step2time是 DateTimes 在 .NET 中不可变。

于 2013-01-11T15:03:43.580 回答