Create an account

Very important

  • To access the important data of the forums, you must be active in each forum and especially in the leaks and database leaks section, send data and after sending the data and activity, data and important content will be opened and visible for you.
  • You will only see chat messages from people who are at or below your level.
  • More than 500,000 database leaks and millions of account leaks are waiting for you, so access and view with more activity.
  • Many important data are inactive and inaccessible for you, so open them with activity. (This will be done automatically)


Thread Rating:
  • 580 Vote(s) - 3.46 Average
  • 1
  • 2
  • 3
  • 4
  • 5
Powershell - how to pre-evaluate variables in a scriptblock for Start-Job

#1
I want to use background jobs in Powershell.

How to make variables evaluated at the moment of ScriptBlock definition?

$v1 = "123"
$v2 = "asdf"

$sb = {
Write-Host "Values are: $v1, $v2"
}

$job = Start-Job -ScriptBlock $sb

$job | Wait-Job | Receive-Job

$job | Remove-Job

I get printed empty values of $v1 and $v2. How can I have them evaluated in (passed to) the scriptblock and so to the background job?
Reply

#2
Declare the values as parameters in the script block, then pass them in using `-ArgumentList`

$v1 = "123"
$v2 = "asdf"

$sb = {
param
(
$v1,
$v2
)
Write-Host "Values are: $v1, $v2"
}

$job = Start-Job -ScriptBlock $sb -ArgumentList $v1, $v2

$job | Wait-Job | Receive-Job

$job | Remove-Job
Reply

#3
I'm not at a computer to validate, but this should work:

$sb = {
param($p1,$p2)
Write-Host "Values are: $p1, $p2"
}

$job = Start-Job -ScriptBlock $sb -ArgumentList $v1,$v2

I'll double check this when I get into work.
Reply

#4
One way is to use the [scriptblock]::create method to create the script block from an expanadable string using local variables:

$v1 = "123"
$v2 = "asdf"

$sb = [scriptblock]::Create("Write-Host 'Values are: $v1, $v2'")

$job = Start-Job -ScriptBlock $sb

Another method is to set variables in the InitializationScript:

$Init_Script = {
$v1 = "123"
$v2 = "asdf"
}

$sb = {
Write-Host "Values are: $v1, $v2"
}

$job = Start-Job -InitializationScript $Init_Script -ScriptBlock $sb

A third option is to use the -Argumentlist parameter:

$v1 = "123"
$v2 = "asdf"

$sb = {
Write-Host "Values are: $($args[0]), $($args[1])"
}

$job = Start-Job -ScriptBlock $sb -ArgumentList $v1,$v2
Reply

#5
The simplest solution (which requires V3 or greater) looks like this:

$v1 = "123"
$v2 = "asdf"

$sb = {
Write-Host "Values are: $using:v1, $using:v2"
}

$job = Start-Job -ScriptBlock $sb

You can think of $using as working roughly like an explicit param() block and passing -ArgumentList, only PowerShell handles that for you automatically.
Reply



Forum Jump:


Users browsing this thread:
1 Guest(s)

©0Day  2016 - 2023 | All Rights Reserved.  Made with    for the community. Connected through