1

約 10 万の .doc ファイルをロードするための次のスクリプトを取得し、それらに対してプログラムを実行しました。出力に基づいて、ファイルはフォルダーにグループ化されます。ファイルが少ないローカル ディレクトリでスクリプトをテストしたところ、期待どおりに動作しました。

しかし、ファイルの大規模なコーパスからロードする場合、スクリプトは「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"
4

1 に答える 1

6

get-childitem配列に保存するのではなく、出力をパイプすると、希望どおりに機能します。

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

$file = $_スクリプトをあまり変更する必要がないように 注意してください。

効率に関しては、私が言うことはあまりありませんが、この方法では、すべてのファイル オブジェクトを配列 ( $files) に格納することも避けているため、このバージョンでは少なくとも不要な操作を回避しています。

于 2012-05-09T12:05:12.637 に答える