Tato funkce lambda provádí podle očekávání:
$WriteServerName = {
param($server)
Write-Host $server
}
$server = servername
$WriteServerName.invoke($server)
servername
Nicméně, s použitím stejné syntaxe, následující skript výzvu k zadání pověření a poté ukončí do příkazového řádku (běh takto:. \ ScriptName.ps1 -ConfigFile Chef.config), což znamená, že funkce lambda nejsou řádně provádění (pro testování každý měl jen výstup název serveru).
Proč bývalý funkce lambda vrátí název serveru, ale ty ve skriptu ne?
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