Как начать работу с функцией, которую я только что определил?
Как начать работу с функцией, которую я только что определил?
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", но я не знаю, как я могу использовать те функции в работе :(