2017-07-31 10 views
0

パワーシェルを使用して複数のファイルからレコードを抽出しようとしています。しかし、これは膨大なファイル数のために長い時間がかかります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

ありがとう@ロビン。私はそれをチェックしてみましょう –

+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" は、Get-コンテンツを$ファイル[$ I ]。フルネーム|選択文字列 - パターン "OB_ [0-9] F_AHU *" |セット内容$ 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ブロック%{}の内側に新アイテムでの新しいファイルを作成するために必要なすべてである、見つかったファイル名と行が含まれます。

小さな改善です。

関連する問題