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

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

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.

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

Ответ 1

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

В вашем примере:

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

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

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

Ответ 2

@Рекомендуемое предложение InitializationScript велико.

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

$FOO = {write-host "HEY"}

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

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

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

Start-Job -ScriptBlock $foo -ArgumentList "HEY" | wait-job | receive-job

Ответ 3

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

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

Ответ 4

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

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

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

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

Ответ 5

У меня другой, но похожий вопрос;) Как я могу включить функции из файла?? обычно в скрипте это выглядит как ".\functions.ps1", но я не знаю, как я могу использовать те функции в работе :(