2011-07-03 144 views
4

说Get-ChildItem返回数百万个项目。 PowerShell如何处理这个问题?我可以批量处理数据吗?命令是否会阻止控制台直到检索到数据?PowerShell如何处理大型数据集?

我是PowerShell的新手,所以如果有人能够解释处理操作返回许多项目/可能需要很长时间才能完成的基本原则,那将会很棒。

回答

6

Powershell cmdlet一次处理一条记录。如果将get-childitem的输出传递给脚本块或其他cmdlet,它应该并行执行。也就是说,只要有记录可用,您的脚本块就会执行,而get-childitem仍在检索记录。当然,因为它是一个控制台应用程序,控制台自然会被阻塞,直到处理完所有记录,除非在处理记录期间提示用户输入更多数据,或者用户终止该命令。如果您有时间/资源密集型处理,则可能需要考虑让您的cmdlet使用后台作业(请参阅this msdn article)。

+1

从技术上讲,您也可以通过让ProcessRecord方法在您自己的数据结构中累积记录,然后在EndProcessing方法中处理/生成输出来将记录处理为批处理。尽管这样做的原因不多,但最好将流处理为流,以避免额外的内存要求并利用固有的并行性。 –

+1

这是一个很好的答案 - 让我想到了cmdlet中的Begin,Process和End语句 - 我认为它们也值得一提。开始将发生一次,在处理第一个记录之前,对每个记录重复该过程,并且结束是最后要运行的事情。 与问题没有太大关系,但值得了解是否要使用自定义cmdlet处理大量数据。 (对任何拼写错误致歉!) – Matt