Powershell 5.1: как перебирать файлы параллельно - PullRequest
0 голосов
/ 21 апреля 2020

Мне нужно копировать файлы в зависимости от содержимого. Поэтому я получаю все файлы, читаю содержимое и спрашиваю регулярное выражение, является ли оно действительным. После этого я хочу скопировать файл в определенный каталог. Моя проблема в том, что существует много исходных файлов, поэтому мне нужно выполнить это параллельно.

Я не могу использовать параллельную функцию PowerShell ForEach-Object, потому что мы используем Powershell Version <7.0. Использование рабочего процесса является способом замедления. </p>

$folder = "C:\InputFiles"
workflow CopyFiles
{
    foreach -parallel ($file in gci $folder *.* -rec | where { ! $_.PSIsContainer })
    {
        //Get content and compare against a regex
        //Copy if regex matches
    }
}
CopyFiles

Есть идеи, как запустить это параллельно с Powershell?

Ответы [ 2 ]

0 голосов
/ 21 апреля 2020

Другой вариант - использование заданий. Вам нужно определить ScriptBlock, принимающий путь и регулярное выражение в качестве параметров, а затем запустить его в параллельном режиме в фоновом режиме. Прочтите о командлетах Start-Job, Receive-Job, Get-Job, Remove-Job. Но я не думаю, что это действительно поможет:

  • Я не ожидаю, что это будет намного быстрее, чем рабочие процессы
  • Вам придется регулировать и контролировать выполнение заданий добавление сложности к сценарию
  • Существенные накладные расходы на выполнение заданий
  • Скорее всего, узкое место в этой задаче - файловая система, поэтому любой подход к доступу к файлам в paralell на самом деле не поможет здесь
0 голосов
/ 21 апреля 2020

Можете ли вы запустить следующий скрипт со своей конфигурацией и посмотреть, сколько времени занимает этот метод? Мне требуется 100 мс, чтобы найти около 2000 вхождений текста PowerShell в нем.

$starttime = Get-Date;
$RegEx = 'Powershell'
$FilesFound = Get-ChildItem -Path "$PSHOME\en-US\*.txt" | Select-String -Pattern $RegEx
Write-Host "Total occurence found: $($FilesFound.Count)"
$endtime = Get-Date;

Write-Host "Time of execution:" ($endtime - $starttime).Milliseconds "Mili Seconds";
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...