У меня есть сценарий PowerShell для выполнения пакетной обработки нескольких изображений, и я хотел бы выполнить некоторую параллельную обработку. Powershell, похоже, имеет некоторые параметры фоновой обработки, такие как start-job, wait-job и т. Д., Но единственным хорошим ресурсом, который я нашел для выполнения параллельной работы, было написание текста сценария и его запуск ( многопоточность PowerShell )
В идеале мне нужно что-то вроде parallel foreach в .NET 4.
Что-то довольно безобидное, вроде:
foreach-parallel -threads 4 ($file in (Get-ChildItem $dir))
{
.. Do Work
}
Может, мне лучше просто перейти на С # ...
multithreading
powershell
parallel-processing
Алан Джексон
источник
источник
receive-job (wait-job ($a = start-job { "heyo!" })); remove-job $a
или$a = start-job { "heyo!" }; wait-job $a; receive-job $a; remove-job $a
Также обратите внимание, что если вы позвонитеreceive-job
до завершения задания, вы можете вообще ничего не получить.(get-job $a).jobstateinfo.state;
Ответы:
Вы можете выполнять параллельные задания в Powershell 2, используя фоновые задания . Ознакомьтесь с Start-Job и другими командлетами заданий.
источник
Test-Path "\\$_\c$\Something"
я ожидаю, что она расширится$_
до текущего элемента. Однако это не так. Вместо этого он возвращает пустое значение. Это происходит только изнутри блоков скрипта. Если я напишу это значение сразу после первого комментария, похоже, что оно работает правильно.Ответ Стива Таунсенда верен в теории, но не на практике, как указал @likwid. Мой исправленный код учитывает барьер контекста работы - по умолчанию ничто не преодолевает этот барьер! Таким образом, автоматическая
$_
переменная может использоваться в цикле, но не может использоваться непосредственно в блоке сценария, потому что она находится внутри отдельного контекста, созданного заданием.Чтобы передать переменные из родительского контекста в дочерний контекст, используйте
-ArgumentList
параметр onStart-Job
для его отправки и используйтеparam
внутри блока скрипта для его получения.(Обычно мне нравится давать ссылку на документацию PowerShell в качестве подтверждающего доказательства, но, увы, мой поиск оказался бесплодным. Если вы случайно знаете, где задокументировано разделение контекста, оставьте здесь комментарий, чтобы сообщить мне!)
источник
Start-Job -FilePath script.ps1 -ArgumentList $_
http://gallery.technet.microsoft.com/scriptcenter/Invoke-Async-Allows-you-to-83b0c9f0
Я создал invoke-async, который позволяет одновременно запускать несколько блоков скриптов / командлетов / функций. это отлично подходит для небольших заданий (сканирование подсети или wmi-запрос для сотен машин), потому что накладные расходы на создание пространства выполнения по сравнению со временем запуска start-job довольно значительны. Его можно использовать так.
со скриптблоком,
просто командлет / функция
источник
В наши дни на этот вопрос так много ответов:
foreach-object -parallel
альтернативу # 4Вот рабочие процессы с буквально foreach -parallel:
Или рабочий процесс с параллельным блоком:
Вот пример api с runspaces:
источник
Фоновые задания дороги в настройке и не подлежат повторному использованию. У PowerShell MVP Ойсин Грехан есть хороший пример многопоточности PowerShell.
(25.10.2010 сайт не работает, но доступен через веб-архив).
Я использовал адаптированный сценарий Oisin для использования в процедуре загрузки данных здесь:
http://rsdd.codeplex.com/SourceControl/changeset/view/a6cd657ea2be#Invoke-RSDDThreaded.ps1
источник
Чтобы завершить предыдущие ответы, вы также можете использовать
Wait-Job
для ожидания завершения всех заданий:источник
В Powershell 7 вы можете использовать ForEach-Object -Parallel
источник
Если вы используете новейшую кросс-платформенную оболочку PowerShell (которую, кстати, следует) https://github.com/powershell/powershell#get-powershell , вы можете добавить одиночный
&
запуск параллельных скриптов. (Использование;
для последовательного запуска)В моем случае мне нужно было запустить 2 сценария npm параллельно:
npm run hotReload & npm run dev
Вы также можете настроить npm для использования
powershell
в его скриптах (по умолчанию он используетсяcmd
в Windows).Запустите из корневой папки проекта:
npm config set script-shell pwsh --userconfig ./.npmrc
а затем используйте одну команду сценария npm:npm run start
источник