1

我得到了以下脚本来加载大约十万个 .doc 文件并在它们上运行一个程序。根据输出,文件被分组到文件夹中。我在一个文件很少的本地目录上测试了脚本,它按预期工作。

但是当从大量文件加载时,脚本会打印“Loading Files....”并停留在那里。脚本似乎正在等待它从语料库中加载所有文件。如果是这种情况,有没有办法一次加载和处理一个文件?

如果您也可以评论效率方面,那就太好了。

$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 回答