2013-12-04 5 views
1

Мне нужно выполнить некоторую операцию над сценарием PS, который должен запускаться параллельно. Использование PS Jobs не является реальным вариантом, поскольку задачи, которые должны быть парализованы, зависят от пользовательских функций, которые определены внутри модуля separete. Хотя я знаю, что могу использовать флаг -InitializationScript и импортировать модуль, который содержит мою пользовательскую функцию, я думаю, что я теряю скорость, так как импорт дырочного модуля является «трудоемким».Выполнение потоков паралелей на Powershell

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

$ps = [Powershell]::Create().AddScript({ Get-CustomADDomain -dnsdomain $env: }) 
$threadRes = $ps.beginInvoke() 
$ps.EndInvoke($threadRes) 

Недостатком этого подхода является то, что, так как я создаю новый «процесс Powershell» это пространство выполнения не мои пользовательские модули загружены и, таким образом, я нахожусь в той же ситуации, У меня с Джобсом.

Если я пытаюсь прикрепить текущее пространство выполнения вновь созданный $ пса, используя следующий код:

$ps = [Powershell]::Create() 
$ps.runspace = $host.runspace 
$ps.AddScript({ Get-CustomADDomain -dnsdomain $env: }) 
$threadRes = $ps.beginInvoke() 
$ps.EndInvoke($threadRes) 

Я получаю сообщение об ошибке, потому что я пытаюсь закрыть текущий трубопровод (плохая вещь).

Я думаю, что мой второй снимок на правильном пути, но я не могу получить результаты от вызова сценария, или, по крайней мере, я не могу понять, как это сделать.

Очевидно, что я должен упустить что-то, поэтому любой совет, который у вас может быть, будет очень притягательным !!!!

+0

Мне интересно, как это исходит. Я пытался сделать то же самое, что и вы, в течение нескольких дней и не смог. Я закончил использование заданий, потому что PS просто не способен запускать параллельные потоки. – Tudor

+1

Вы посмотрели на [это Эй! Scripting Guy post] (http://blogs.technet.com/b/heyscriptingguy/archive/2013/09/29/weekend-scripter-max-out-powershell-in-a-little-bit-of-time-part -2.aspx)? Не делал этого сам, но он идет по тому, что вы пытаетесь сделать. – beavel

+0

@beavel Я определенно должен улучшить свои навыки «поиска», это то, что я ищу. Я попробую это и дам вам знать парней :) – SantiFdezMunoz

ответ

0

Новое задание или пробел не наследует функции от модуля, который был импортирован в текущий сеанс. При этом вам не нужно импортировать весь модуль. Если у вас есть определенные функции в текущем сеансе, вам нужно иметь доступное в задании, вы можете добавить только те функции, как это:

function test_function {'This is a test'} 
function test_function2 {'This is also a test'} 

$job_functions = 'test_function','test_function2' 

$init = [scriptblock]::Create(
$(foreach ($job_function in $job_functions) 
    { 
@" 

function $job_function 
{$((get-item function:$job_function).definition)} 

"@ 
    })) 


$init 

function test_function 
{'This is a test'} 

function test_function2 
{'This is also a test'} 
+0

Спасибо @mjolinor, ваше решение отлично работало !! – SantiFdezMunoz

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