powershell - PowerShell-不执行Lambda函数

标签 powershell lambda jobs

此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

最佳答案

如果没有测试,我将继续说这是因为您将脚本块执行放在PowerShell Jobs中,然后对它们不执行任何操作。当您开始工作时,它会启动一个新的PowerShell实例,并执行您提供的代码以及所提供的参数。完成后,完成的PSRemotingJob对象将坐在那里,直到您实际对其执行任何操作之前,不执行任何操作。

在您的代码中,您启动的所有作业都分配给$ Jobs变量。您还可以使用 Get-Job 获得所有正在运行的作业:

Get-Job -State Running

如果要获取作业返回的任何数据,则必须使用 Receive-Job
# Either
$Jobs | Receive-Job
# Or
Get-Job -State Running | Receive-Job

关于powershell - PowerShell-不执行Lambda函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44640487/

相关文章:

linux - 以 & 结尾的 bash 命令前景

linux - jobs -l 在脚本中写入时不将输出打印到文件

c# - 将 Powershell 窗口的输出提取到字符串

powershell - Powershell 中的标准化文件路径比较

java - 通过过滤器列表运行字符串列表

python - 如何按值对字典的键进行排序?

powershell - Powershell 的 get-counters cmdlet 中返回的 "cooked value"是什么?

powershell - 测试函数返回值是否为空

c# - c# lambda 是如何捕获变量的

ruby-on-rails - 如果自创建之日起 15 分钟内未在 Rails 中更新,如何设置计时器以自动设置字段值?