سؤال

أريد استخدام وظائف الخلفية في PowerShell.

كيفية جعل المتغيرات تقييم في لحظة تعريف ScriptBlock؟

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

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

$job = Start-Job -ScriptBlock $sb

$job | Wait-Job | Receive-Job

$job | Remove-Job

أحصل على القيم الفارغة المطبوعة من $ V1 و $ V2. كيف يمكنني تقييمهم في (تم نقله إلى) scriptblock وما إلى ذلك إلى وظيفة الخلفية؟

هل كانت مفيدة؟

المحلول

طريقة واحدة هي استخدام [ScriptBlock] :: إنشاء طريقة لإنشاء كتلة البرنامج النصي من سلسلة قابلة للتفسير باستخدام المتغيرات المحلية:

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

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

$job = Start-Job -ScriptBlock $sb

طريقة أخرى هي تعيين المتغيرات في initializationscript:

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

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

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

الخيار الثالث هو استخدام المعلمة -argumentList:

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

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

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

نصائح أخرى

أبسط الحلول (الذي يتطلب V3 أو أكبر) يبدو مثل هذا:

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

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

$job = Start-Job -ScriptBlock $sb

يمكنك التفكير في استخدام $ على أنه يعمل تقريبًا مثل كتلة param () صريحة ومرحلة -ArgumentList ، فقط PowerShell يتعامل معك تلقائيًا.

أعلن أن القيم كمعلمات في كتلة البرنامج النصي ، ثم تمريرها في استخدامها -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

أنا لست على جهاز كمبيوتر للتحقق من صحة ، ولكن هذا يجب أن ينجح:

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

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

سوف أتحقق من هذا الأمر عندما أذهب إلى العمل.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top