PowerShell:(ConvertTo- * | Set-Content)和(Export- *)之间的区别?

时间:2014-07-26 21:26:37

标签: windows powershell powershell-v2.0 powershell-v3.0 powershell-v4.0

我是PowerShell的新手,并尝试以写入方式学习东西,我注意到在这种情况下我可以用多种不同的方式导出数据,我想问的是这种情况,

Get-Process | ConvertTo-Csv | Set-Content -Path .\Process.txt

和:

 Get-Process | Export-Csv -Path .\Process.txt

两者都将进程列表导出到桌面上的CSV文件中,并给出相同的结果。

第一个:

首先将进程转换为CSV然后将其写入文件。

第二个:

将进程直接导出到文件。

两种情况之间真正区别的是性能差异,时间执行差异,还是其他我不知道的事情?

1 个答案:

答案 0 :(得分:3)

他们几乎一样。在性能和时间方面不应该有任何重大差异:

Measure-Command { Get-Process | ConvertTo-Csv | Set-Content -Path .\Process.txt }  

Days              : 0
Hours             : 0
Minutes           : 0
Seconds           : 2
Milliseconds      : 880
Ticks             : 28801761
TotalDays         : 3,33353715277778E-05
TotalHours        : 0,000800048916666667
TotalMinutes      : 0,048002935
TotalSeconds      : 2,8801761
TotalMilliseconds : 2880,1761 

Measure-Command { Get-Process | Export-Csv -Path .\Process2.txt }

Days              : 0
Hours             : 0
Minutes           : 0
Seconds           : 2
Milliseconds      : 772
Ticks             : 27724661
TotalDays         : 3,20887280092593E-05
TotalHours        : 0,000770129472222222
TotalMinutes      : 0,0462077683333333
TotalSeconds      : 2,7724661
TotalMilliseconds : 2772,4661

这是因为Export-CSVConvertTo-CSV运行了相同代码的90%。它们共享相同的辅助类Microsoft.PowerShell.Commands.ExportCsvHelper以创建标头并将对象转换为csv。唯一的区别是ConvertTo-CSV使用WriteObject()将CSV对象(字符串)写入管道,而Export-CSV使用StreamWriter直接将其写入文件。

要自己查找,可以查看Microsoft.PowerShell.Commands.Utility.dll内部。我不会直接发布代码,因为我不确定它是否合法。 : - )

如果您需要通过第三方API等显示或发送CSV输出,请使用ConvertTo-CSV。如果您需要存储在CSV文件中的数据,则应使用Export-CSV