如何开始我刚定义的函数的作业?

Ale*_*x58 17 powershell jobs

如何开始我刚定义的函数的作业?

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.
Run Code Online (Sandbox Code Playgroud)

我该怎么办?谢谢.

Ryn*_*ant 23

正如@Shay指出的那样,FOO需要为工作定义.另一种方法是使用该-InitializationScript参数来准备会话.

对于你的例子:

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

Start-Job -InitializationScript $functions -ScriptBlock {FOO}|
    Wait-Job| Receive-Job
Run Code Online (Sandbox Code Playgroud)

如果要对不同的作业使用相同的功能,这可能很有用.

  • 这很好,但是如何在主脚本中使用相同的功能呢? (2认同)

man*_*lds 10

@Rynant的建议InitializationScript很棒

我认为(脚本)块的目的是让你可以传递它们.所以取决于你是怎么做的,我会说:

$FOO = {write-host "HEY"}

Start-Job -ScriptBlock $FOO | wait-job |Receive-Job
Run Code Online (Sandbox Code Playgroud)

当然,您也可以参数化脚本块:

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

Start-Job -ScriptBlock $foo -ArgumentList "HEY" | wait-job | receive-job
Run Code Online (Sandbox Code Playgroud)


Ali*_*lin 6

它对我有用:

Start-Job -ScriptBlock ${Function:FOO}
Run Code Online (Sandbox Code Playgroud)

  • 这对我来说也很有效,还添加了“-ArgumentList”。谢谢! (2认同)
  • 这很棒,但应该注意的是,只有当相关函数不在全局范围内调用 _another_ 函数时,这才有效。据我所知,这相当于使用名为“${Function:FOO}”的内容作为脚本块,不多也不少。这确实与接受的答案相同,唯一的区别是它重用现有的函数定义,而不是分配然后使用(脚本)块。 (2认同)

Bob*_*mer 5

对@Rynant 答案的改进:

您可以在脚本主体中正常定义该函数:

Function FOO 
{ 
  Write-Host "HEY" 
} 
Run Code Online (Sandbox Code Playgroud)

然后在脚本块中回收这个定义:

$export_functions = [scriptblock]::Create(@"
  Function Foo { $function:FOO }
"@)
Run Code Online (Sandbox Code Playgroud)

(如果你有一个实质性的函数体,则更有意义)然后将它们传递给Start-Job上面的:

Start-Job -ScriptBlock {FOO} -InitializationScript $export_functions| Wait-Job | Receive-Job
Run Code Online (Sandbox Code Playgroud)

我喜欢这种方式,因为通过在调试器下本地运行作业来调试作业更容易。

  • 我真的希望有人在这里回答@DougN 的评论。他的要求非常清楚;这正是我想知道的。我不知道在 stackoverflow 上哪里可以找到他的问题。 (2认同)