为什么PowerShell的Start-Job有时会在没有执行代码的情况下完成?

时间:2018-04-10 15:30:04

标签: powershell start-job scriptblock

我一直在调查我们在某些部署工作中看到的问题。

对于后台,我们将多个服务部署到Azure中,并且有一个主脚本使用Start-Job来运行并发子作业。大部分时间这都有效,尽管偶尔我们会看到子作业报告已完成的构建,但其HasMoreData属性为false,并且没有任何错误出现在任何地方。我们运行的子作业无法在没有至少一行日志的情况下成功完成,因此这似乎是启动作业时出错。

这是我们用来创建工作的命令:

Start-Job -Name $RepoName -ScriptBlock {Invoke-Expression -Command "$args"} -ArgumentList $command

在讨论过程中,我们认为可能存在错误,但是Invoke-Expression正在吃它,所以我们将创造的工作改为:

Start-Job -Name $RepoName -ScriptBlock ([ScriptBlock]::Create(".{$command}"))

自昨天做出改变以来,我们没有看到这个问题重新出现。为了测试,我创建了一个新的分支,然后我又回到Invoke-Expression方法并立即开始再次看到错误。

我只是希望看看是否有人可能知道为什么会出现此问题,以及为什么在使用Invoke-Expression方法时这是一个间歇性问题,而不是[ScriptBlock]::Create方法。

谢谢!

编辑以获得更多背景信息:

因此主脚本(deployAll.ps1)有一个要部署的服务列表,每个服务都构建一个执行命令,构建必要的环境,然后调用每个服务提供的deployService.ps1脚本。 / p>

关于构建要执行的命令,我们有一个所有子作业使用的公共脚本,因此我们将其导入并作为我们构建的命令的一部分登录到Azure,因此实际传递给Start-Job的命令看起来像:

Import-Module $ScriptPath\AzureWrapper.ps1 -Force; $ScriptPath\login.ps1 -AzureAppID $Env:AZURE_APP_ID -AzurePassword $Env:AZURE_PASSWORD -AzureTenantId $Env:AZURE_TENANT_ID; $ScriptPath\..\$RepoName\deploy\deployService.ps1 -subscriptionId '$subscriptionId' -environmentFilePath '$configPath'

此外,在进一步研究Invoke-Expression后,似乎可能是这些设置命令必要的原因,因为它在一个单独的环境中运行。

0 个答案:

没有答案