How can I set a variable in one task and reference it in another?
Since psake is written in PowerShell, all variables follow the PowerShell scoping rules (PS> help about_scope). All the variables declared in the “properties” function have the “script” level scope and any variables declared within a “task” function are local variables.
This means you can reference the “properties” variables from any “task” function but all variables declared within “task” function are not accessible from other “task” functions in the build script.
The following is an example build script that uses a property variable from 2 different task functions:
properties { $x = 1 } task default -depends TaskA, TaskB task TaskA { '$x = ' + $x } task TaskB { '$x = ' + $x }
The output from running the above build is:
Executing task: TaskA $x = 1 Executing task: TaskB $x = 1 Build Succeeded! ---------------------------------------------------------------------- Build Time Report ---------------------------------------------------------------------- Name Duration ---- -------- TaskA 00:00:00.0086706 TaskB 00:00:00.0056644 Total: 00:00:00.0801045
Sometimes you may want/need to set a variable or update a property within a task and then refer to that variable/property from another task.
The following example build script shows how to do that using the “script” scope modifier
properties { $x = 1 } task default -depends TaskA, TaskB task TaskA { $script:x = 100 '$x = ' + $script:x } task TaskB { '$x = ' + $script:x }
The output from the above script:
Executing task: TaskA $x = 100 Executing task: TaskB $x = 100 Build Succeeded! ---------------------------------------------------------------------- Build Time Report ---------------------------------------------------------------------- Name Duration ---- -------- TaskA 00:00:00.0057736 TaskB 00:00:00.0054096 Total: 00:00:00.0820067
The following example does not update a property, it sets a “script” level variable (“y”) within one task and references it in another task.
task default -depends TaskA, TaskB task TaskA { $script:y = 100 '$y = ' + $script:y } task TaskB { '$y = ' + $script:y }
The output from the above build script:
Executing task: TaskA $y = 100 Executing task: TaskB $y = 100 Build Succeeded! ---------------------------------------------------------------------- Build Time Report ---------------------------------------------------------------------- Name Duration ---- -------- TaskA 00:00:00.0047757 TaskB 00:00:00.0048073 Total: 00:00:00.1244049
In case you create a variable with script scope, the variable is kept inside the psake module. This means, that if you run Invoke-Psake again, the variable is available. That’s why variables with script scope should be used carefully. Consider them as global variables accessible for all scripts running in psake.
Next – How can I access functions that are in other script files from within psake?