如何开始我刚定义的函数的作业?
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)
如果要对不同的作业使用相同的功能,这可能很有用.
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)
它对我有用:
Start-Job -ScriptBlock ${Function:FOO}
Run Code Online (Sandbox Code Playgroud)
对@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)
我喜欢这种方式,因为通过在调试器下本地运行作业来调试作业更容易。
| 归档时间: |
|
| 查看次数: |
24100 次 |
| 最近记录: |