如何开始我刚刚定义的功能的作业?
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.
我该怎么办? 感谢。
答案 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