Yesterday we learned how to use the InitializationScript parameter of Start-Job. Today we are going to allow for further modularization
of our code and send multiple functions to Start-Job. We could very easily send multiple functions
in the same script block, but I need to pick and choose which functions I will
be working with for each process so I need to be able to send them separately. Here is our code.
$JobFunction1 = {
Function Beep
{
Param ($Tone)
[console]::beep($Tone,200)
}
}
$JobFunction2 = {
Function Beep2
{
Param ($Tone, $Time)
[console]::beep($Tone,$Time)
}
}
$InitializationScript = $executioncontext.invokecommand.NewScriptBlock("$JobFunction1 $JobFunction2")
$JobSplat = @{
Name = "Test1"
InitializationScript = $InitializationScript
ArgumentList = 300,
400, 200
}
Start-Job @JobSplat
-ScriptBlock {
Param($Value, $Tone,
$Time)
Beep
-Tone $Value
Beep2
-Tone $Tone
-Time $Time
}
A lot of the code is the same as yesterday with a few
exceptions. Notice that we are creating $JobFunction1
and $JobFunction2. This allows me to place a single function
inside of a script block, but be able to send multiple script blocks to Start-Job. I am also using the $ExecutionContext automatic variable. According to About_Automatic_Variables, this
variable:
Contains an
EngineIntrinsics object that represents the execution context of the Windows
PowerShell host. You can use this variable to find the execution objects that
are available to cmdlets.
OK, that was informative.
It is on object of type System.Management.Automation.EngineIntrinsics.
In short, you can create new script blocks with it. I use it to join the 2 variables containing
the script blocks that I need to send to Start-Job.
I save the output in a variable called $InitializationScript.
This is now the value of –InitializationScript.
When you run this code, you will hear two beeps.
Comments