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

时间:2011-08-23 13:53:16

标签: 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.

我该怎么办? 感谢。

7 个答案:

答案 0 :(得分:21)

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

对于你的例子:

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

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

如果您想为不同的工作使用相同的功能,这将非常有用。

答案 1 :(得分:7)

@Rynant对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

答案 2 :(得分:3)

该函数需要在scriptblock中:

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

答案 3 :(得分:1)

对@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

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

答案 4 :(得分:0)

对我有用。

Start-Job -ScriptBlock ${Function:FOO}

答案 5 :(得分:0)

略有不同。函数只是分配给变量的脚本块。哦,必须是一个threadjob。不能是foreach-object -parallel。

(trans_matrix/trans_matrix[2,2]).flat[:8]

答案 6 :(得分:0)

@Ben Power在接受的答案下的评论也是我的关注,因此我在Google中搜索了如何获取函数定义,并且我发现Get-Command-尽管这仅获取函数体。但是,如果函数来自其他地方(例如点源文件),也可以使用它。因此,我提出了以下内容(请遵循我的命名约定:)),其想法是重新构建由换行符分隔的函数定义:

Filter Greeting {param ([string]$Greeting) return $Greeting}
Filter FullName {param ([string]$FirstName, [string]$LastName) return $FirstName + " " + $LastName}
$ScriptText = ""
$ScriptText += "Filter Greeting {" + (Get-Command Greeting).Definition + "}`n"
$ScriptText += "Filter FullName {" + (Get-Command FullName).Definition + "}`n"
$Job = Start-Job `
            -InitializationScript $([ScriptBlock]::Create($ScriptText)) `
            -ScriptBlock {(Greeting -Greeting "Hello") + " " + (FullName -FirstName "PowerShell" -LastName "Programmer")}
$Result = $Job | Wait-Job | Receive-Job
$Result
$Job | Remove-Job