2017-07-31 77 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塊%內創建新項目的新文件{}。

小改進。

相關問題