我对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组件的调用?或两者兼而有之?
答案 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}}