2012-05-09 20 views
1

約10万の.docファイルを読み込むための次のスクリプトを入手し、プログラムを実行しました。出力に基づいて、ファイルはフォルダにグループ化されます。私は、ファイルがほとんどないローカルディレクトリでスクリプトをテストし、期待どおりに動作します。PowerShellを使用して、一度に1つずつファイルをロードして処理する方法

しかし、ファイルの大きなコーパスから読み込むと、スクリプトは "Loading Files ...."と表示されたままになります。コーパスからすべてのファイルがロードされるまで、スクリプトが待機しているようです。この場合、一度に1つのファイルを読み込んで処理する方法がありますか?

効率面でもコメントできれば素晴らしいと思います。

$path = "\\Storage\100kCorpus" 
$filter = "*.doc" 
$count = 0 
Write-Host "Loading files...."; 
$files = @(get-childitem -recurse -path $path -filter $filter) 
Write-Host "files loaded"; 
foreach ($file in $files) { 
    $count ++ 
    Write-Host "$file.FullName"; 
    $out = & "D:\Test\doc\Verify.exe" /i:$file.FullName 
    $failed_file_location="D:\Test\doc\2875555\$out"; 
    if (($out -ne "passed") -and !(Test-Path -path $failed_file_location)){ 
     [IO.Directory]::CreateDirectory($failed_file_location) 
     Copy-Item $file $failed_file_location 
    } 
} 

Write-Host "There are $count files with the pattern $filer in folder $path" 

答えて

6

それはあなたが望むように動作するかどうか、あなたパイプあなたがする必要はありませんちょうどそうです

get-childitem -recurse -path $path -filter $filter | % { 
    $file = $_ 
    $count ++ 
    # etc ... 
} 

$file = $_ことの代わりに、配列に保存するget-childitemの出力、すなわち、あなたのスクリプトをあまりにも変更してください。

効率性この方法では、すべてのファイルオブジェクトを配列($files)に格納しないようにしていることを除いて、このバージョンでは少なくとも不要な操作は避けています。

関連する問題