borisdenis
@borisdenis
Ленив и вреден...

Как цикл ForEach преобразовать в ForEach-​Object для распаралеливания выполнения?

Имеем скрипт, который бекапит поочереди каждую папку из списка папок по заданному пути, всё бекапится последовательно и получается очень долго, свободные ресурсы при этом есть. Поэтому появилось желание заставить бекапить папки не последовательно, а параллельно. Гугл подсказал, что для этого необходимо цикл ForEach преобразовать в ForEach-​Object и там уже можно будет указать параллельное выполнение команд, но тут у меня тупик, никак не соображу как правильно. Имею цикл такой, может кто имеет опыт работы с ForEach-​Object и даст подсказку?
foreach ($item in $folderlist) {
    $bakname = TranslitToLAT $item.Name
    BackupFile -pathfolderbackup $item.FullName -backupName $bakname
}
  • Вопрос задан
  • 435 просмотров
Решения вопроса 1
@MaxKozlov Куратор тега PowerShell
Это ну совсем базовый синтаксис PS

Здесь вы увидите разницу в синтаксисе
https://stackoverflow.com/questions/29148462/diffe...
а уж куда добавить параметр -Parallel, думаю уже догадаетесь
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
hekkaaa
@hekkaaa
C#/.NET Developer
Привет!
Вам нужно воспользоваться workflow и foreach -parallel как и подсказывает MaxKozlov
Учтите что Вам нужно использовать версию 5.1 Powershell в полее поздних версиях ее вырезали.

Вот пример кода который Вам нужен:
(код просто копирует файлики с одной папки в другую. Думаю на примере вы сможете интегрировать свой бекап)
workflow Test-Workflow
{
    $Disk1 = Get-ChildItem C:\Temp\1

    # The disks are processed in parallel.
    ForEach -Parallel ($Disk in $Disk1)
    {
        $DiskFrom = "C:\Temp\1\$Disk"
        # The commands run sequentially on each disk.
        Copy-Item -Path $DiskFrom -Destination C:\Temp\2\
        
    }
    Write-Output "Files copied."
}

Test-Workflow


Надеюсь помог. Хорошего дня!
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы