2017-06-19 18 views
2

這lambda函數按預期執行:PowerShell的 - lambda函數不執行

$WriteServerName = { 

param($server) 

Write-Host $server 

} 

$server = "servername" 

$WriteServerName.invoke($server) 

servername 

然而,使用相同的語法,下面的腳本提示輸入憑據,然後退出命令行(運行這樣的:\。 ScriptName.ps1 -ConfigFile Chef.config),這意味着lambda函數沒有正確執行(對於測試,每個應該只輸出服務器名稱)。

爲什麼前一個lambda函數返回服務器名稱,但腳本中的那些不是?

Param(

$ConfigFile 

) 

Function Main { 

#Pre-reqs: get credential, load config from file, and define lambda functions. 

$jobs = @() 
$Credential = Get-Credential 
$Username = $Credential.username 
$ConvertedPassword = [System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($Credential.password) 
$Password = [System.Runtime.InteropServices.Marshal]::PtrToStringAuto($ConvertedPassword) 
$Config = Get-Content $ConfigFile -Raw | Out-String | Invoke-Expression 

#Define lambda functions 

$BootStrap = { 

    param($Server)  

    write-host $server 

} 

$RunChefClient = { 
param($Server)  

    write-host $server 

} 

$SetEnvironment = { 

    param($Server)  

    write-host $server 

}  

#Create bootstrap job for each server and pass lambda functions to Scriptblock for execution. 

if(($Username -ne $null) -and ($Password -ne $null)) 
{ 
ForEach($HashTable in $Config)  

    { 

     $Server = $HashTable.Server 
     $Roles = $HashTable.Roles 
     $Tags = $HashTable.Tags 
     $Environment = $HashTable.Environment  

     $ScriptBlock = { 

      param ($Server,$BootStrap,$RunChefClient,$SetEnvironment)    

       $BootStrap.invoke($Server) 

       $RunChefClient.invoke($Server) 

       $SetEnvironment.invoke($Server)        

     } 

     $Jobs += Start-Job -ScriptBlock $ScriptBlock -ArgumentList @($Server,$BootStrap,$RunChefClient,$SetEnvironment) 
    } 

} 

else {Write-Host "Username or password is missing, exiting..." -ForegroundColor Red; exit} 

} 

Main 

回答

1

未經測試,我要繼續前進,並說這是因爲你把你的腳本塊處決PowerShell Jobs並沒有做與他們任何事情。當你開始一項工作時,它會啓動一個新的PowerShell實例,並執行你給它的代碼以及你給它的參數。一旦完成,完成的PSRemotingJob對象坐在那裏,直到你真的做了什麼事情。

在您的代碼中,您開始的所有作業都被分配給$ Jobs變量。你也可以得到你所有正在運行的作業與Get-Job

Get-Job -State Running 

如果你想獲得任何從自己的任務返回的數據,你將不得不使用Receive-Job

# Either 
$Jobs | Receive-Job 
# Or 
Get-Job -State Running | Receive-Job