2017-07-31 60 views
0

我试图使用Power Shell从多个文件中提取记录,我编写的脚本正在遍历每个文件并将匹配模式的记录写入输出文件。但由于文件数量庞大,这需要很长时间使用PowerShell优化脚本以从多个文件中提取记录

我想知道这是否可以优化。

$files = Get-ChildItem $sourcedirectory\* 

for ($i=0; $i -lt $files.Count; $i++) { 
    $outfile = $files[$i].FullName + "_out" 
    Get-Content $files[$i].FullName| Select-String -Pattern "OB_[0-9]F_AHU*" | Set-Content $outfile 
} 


if (!(Test-Path -path $targetdirectory)) {New-Item $targetdirectory -Type Directory} 
Move-Item -Path $sourcedirectory\*_out -Destination $targetdirectory 
+3

您可能会想要查看PowerShell作业或多线程方法的运行空间。模块PoshRSJobs很有用;它提供了一种“类似工作”的方式来处理运行空间。 – Robin

+0

谢谢@Robin。让我看看 –

+0

你使用的是什么版本的PowerShell('$ PSVersionTable.PSVersion.Major')? –

回答

0

你能发表一些你想要完成的更多细节吗?

在表面值,这是一个解决方案,并行解析每个文件。我不确定自己会使用多少个并发作业,但这应该让你开始了这条路。据

$files = Get-ChildItem $sourcedirectory\* 

foreach -parallel ($file in $files) { 
    $outfile = $file.FullName + "_out" 
    Get-Content $file.FullName | Select-String -Pattern "OB_[0-9]F_AHU*" | out-file -Append $outfile 
} 

为整体目标,有时PowerShell是不是做这项工作的最佳工具:

试试这个。无论何时您想要解析大量数据,都应该考虑将这些数据转储到数据库中。你可以使用像SQL Express这样的东西并上传你的文件1次(慢速操作),然后能够从那以后快速解析这些数据。既然我不知道你在努力完成什么或者你的数据是什么样的,我不能给你一个好主意,这是否值得在你的情况下。

+0

我尝试使用-parallel,但它不工作,这里是更新的版本。你能暗示出哪里出了什么问题吗? '工作流程test1的{$ 文件= GET-ChildItem $ sourceDir \ * 的foreach -parallel($文件$文件){$ = OUTFILE $ file.FullName + “_out” 获取内容$文件[$ I ] .FullName |选择字符串 - 模式“OB_ [0-9] F_AHU *”| Set-Content $ outfile } } ' –

0

您可以直接将新文件写入目标目录,而不是将它们从源目录中移出。

$sourceDir = "C:\users\you\documents\somefiles" 
$targetDir = "C:\users\you\documents\somefiles\targetDir" 

if(!(Test-Path $targetDir)) { 
    New-Item -Path $targetDir -ItemType d 
} 

(Get-ChildItem $sourceDir | Select-String -Pattern "OB_[0-9]F_AHU*") | 
    %{ New-Item -Path $targetDir -Name ($_.Filename + "_out") -Value $_.Line} 

选择字符串的输出将包含在找到匹配的文件名和行,这是所有你需要的的foreach块%内创建新项目的新文件{}。

小改进。

相关问题