Как начать задание функции, которую я только что определил? - PullRequest
14 голосов
/ 23 августа 2011

Как запустить задание функции, которую я только что определил?

function FOO { write-host "HEY" } Start-Job -ScriptBlock { FOO } |
Receive-Job

Receive-Job: The term 'FOO' is not recognized as the name of cmdlet,
function ,script file or operable program.

Что мне делать? Спасибо.

Ответы [ 4 ]

21 голосов
/ 23 августа 2011

Как указывает @Shay, для работы необходимо определить FOO.Другой способ сделать это - использовать параметр -InitializationScript для подготовки сеанса.

Для вашего примера:

$functions = {
    function FOO { write-host "HEY" }
}

Start-Job -InitializationScript $functions -ScriptBlock {FOO}|
    Wait-Job| Receive-Job

Это может быть полезно, если вы хотите использовать одни и те же функции для разных заданий.

7 голосов
/ 23 августа 2011

@ предложение Ринанта о InitializationScript велико

Я думал, что назначение (скриптовых) блоков состоит в том, чтобы вы могли их передавать. Поэтому, в зависимости от того, как вы это делаете, я бы сказал:

$FOO = {write-host "HEY"}

Start-Job -ScriptBlock $FOO | wait-job |Receive-Job

Конечно, вы также можете параметризовать блоки скриптов:

$foo = {param($bar) write-host $bar}

Start-Job -ScriptBlock $foo -ArgumentList "HEY" | wait-job | receive-job
3 голосов
/ 23 августа 2011

Функция должна находиться внутри блока скрипта:

Start-Job -ScriptBlock { function FOO { write-host "HEY" } ; FOO } | Wait-Job | Receive-Job
1 голос
/ 04 октября 2016

Улучшение ответа @ Rynant:

Вы можете определить функцию как обычно в основной части скрипта:

Function FOO 
{ 
  Write-Host "HEY" 
} 

, а затем перезапустите это определение в блоке сценария:

$export_functions = [scriptblock]::Create(@"
  Function Foo { $function:FOO }
"@)

(имеет смысл, если у вас есть существенное тело функции), а затем передайте их Start-Job, как указано выше:

Start-Job -ScriptBlock {FOO} -InitializationScript $export_functions| Wait-Job | Receive-Job

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

...