2015-10-07 2 views
0

У меня возникли проблемы с пониманием того, как GetNewClosure работает в сочетании с Start-Job. Дело в точке У меня есть следующий кодGetNewClosure and Start-Job

function Test([string]$Name) 
{ 
    $block = { Write-Host "Name = $Name" }.GetNewClosure() 
    &$block 
    Other $block 
    OtherJob $block 
} 

function Other([scriptblock]$Block) 
{ 
    Write-Host -NoNewline "In Other: " 
    &$Block 
} 

function OtherJob([scriptblock]$Block) 
{ 
    Write-Host -NoNewline "In OtherJob: " 
    $j = Start-Job -ScriptBLock $Block 
    Start-Sleep -s 1 
    $j | Receive-Job 
} 

При вызове кода я получаю

PS C:\> Test "foo" 
Name = foo 
In Other: Name = foo 
In OtherJob: Name = 

Обратите внимание, что $ Имя не захваченный в OtherJob.

Возможно, это связано с началом работы с новым экземпляром PS, но есть ли какое-либо обходное решение для этого (предпочтительнее тот, который не включает использование -ArgumentList)?

PS: Таблица версия должна ли значение

PS C:\> $PSVersionTable 

Name       Value                      
----       -----                      
CLRVersion      2.0.50727.5485                   
BuildVersion     6.1.7601.17514                   
PSVersion      2.0                      
WSManStackVersion    2.0                      
PSCompatibleVersions   {1.0, 2.0}                    
SerializationVersion   1.1.0.1                     
PSRemotingProtocolVersion  2.1 

ответ

0

Побольше прибегая к помощи дало потенциальный обходной путь, взятый из

Powershell - how to pre-evaluate variables in a scriptblock for Start-Job

В принципе вы можете использовать

$otherBlock = [scriptblock]::Create("Write-Host 'Name = $Name'") 
OtherJob $otherBlock 

Или установить переменные в -InitializationScript