When you use variables inside a script block, the variables are evaluated when you run the script block.
To lock variable content, you can create a new "Closure". Once you do this, the script block takes the variable values that were assigned at the time when you created the closure.
$info = 1 $code = { $info } $code = $code.GetNewClosure() $info = 2 & $code
Without the closure, the script block should show "2" because $info contains the value 2 at the time of execution. Because of the closure, the script block instead takes the value that was assigned to $info when the closure was created.