2012-05-09 2 views
1

У меня есть следующий скрипт для загрузки около сотни тысяч файлов .doc и запуск программы на них. На основе вывода файлы группируются в папки. Я протестировал скрипт в локальном каталоге с несколькими файлами, и он работает так, как ожидалось.Как загружать и обрабатывать файлы по одному, используя PowerShell

Но при загрузке из большого массива файлов сценарий печатает «Загрузка файлов ....» и остается там. Кажется, скрипт ждет, пока он загрузит все файлы из корпуса. Если это так, есть способ загрузить и обработать один файл за раз?

Было бы здорово, если бы вы могли комментировать и эффективность.

$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, вместо того, чтобы сохранить его в массив, т.е.

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

Обратите внимание, что $file = $_ просто так вы не должны слишком сильно измените свой сценарий.

Эффективность У меня мало что можно сказать, за исключением того, что таким образом вы также избегаете хранить все объекты файла в массиве ($files), поэтому эта версия, по крайней мере, избегает ненужной операции.

Смежные вопросы