我的PowerShell脚本因计算属性而变慢吗?

时间:2015-09-25 08:26:01

标签: performance powershell

我对PowerShell很新,但是当我只需要一些自动化而不必打破IDE或代码编辑器+编译器时,它会发现它很有用。我有一个脚本,它将列出文件,通过自定义函数运行它,然后选择导出为CSV的特定属性。

ls .\mydir | Convert-ToMyObject | select -Property IdKey, Timestamp `
  | Export-Csv ".\list.csv"
  • 请注意,Timestamp[datetime]对象。

脚本大约需要20-30分钟才能解析~45K文件。

然而,一旦我按照以下方式更改它,处理需要很长很长时间(此时,大约需要2个小时才能完成~25K文件)。

ls .\mydir | Convert-ToMyObject `
  | select -Property IdKey, @{Name="year";Expression={Timestamp.Year}}, `
    @{Name="month";Expression={Timestamp.Month}}, @{Name="day";Expression={Timestamp.Day}}, `
    @{Name="hour";Expression={Timestamp.Hour}}, @{Name="minute";Expression={Timestamp.Minute}}, `
    @{Name="second";Expression={Timestamp.Second}}, @{Name="millisecond";Expression={Timestamp.Millisecond}} `
  | Export-Csv ".\list.csv"

我无法弄清楚这是什么原因(我的google-fu还不够强大)并希望有人可以帮助启发我。是否由于计算出的属性?或者获取datetime组件的调用?或两者兼而有之?

1 个答案:

答案 0 :(得分:2)

您计算属性的语法错误。您在表达式中缺少管道对象($_)。比较一下:

gci | select -Property @{Name="year";Expression={LastWriteTime.Year}}

对此:

gci | select -Property @{Name="year";Expression={$_.LastWriteTime.Year}}

第一个版本运行速度非常慢(每个文件约100毫秒)并且根本不会产生任何有用的输出。第二个非常快。

将您的代码更改为:

select -Property IdKey, @{Name="year";Expression={$_.Timestamp.Year}}, `
@{Name="month";Expression={$_.Timestamp.Month}}, @{Name="day";Expression={$_.Timestamp.Day}}, `
@{Name="hour";Expression={$_.Timestamp.Hour}}, @{Name="minute";Expression={$_.Timestamp.Minute}}, `
@{Name="second";Expression={$_.Timestamp.Second}}, @{Name="millisecond";Expression={$_.Timestamp.Millisecond}}