【问题标题】:Start-Job only runs if I wait for completionStart-Job 仅在我等待完成时运行
【发布时间】:2019-10-22 05:58:08
【问题描述】:

我有一个 Start-Job -ScriptBlock,如果我等待作业完成,它将正确运行。如果我不等待/接收作业完成状态,则 -ScriptBlock 不会运行。我不确定我错过了什么。可能不了解 PS 后台作业的基本行为。

这是在 Win 2012R2 服务器上运行的。以下是我的 $PSVersionTable 转储:

Name                           Value                                                                 
----                           -----                                                                 
PSVersion                      5.0.10586.117                                                         
PSCompatibleVersions           {1.0, 2.0, 3.0, 4.0...}                                               
BuildVersion                   10.0.10586.117                                                        
CLRVersion                     4.0.30319.42000                                                       
WSManStackVersion              3.0                                                                   
PSRemotingProtocolVersion      2.3                                                                   
SerializationVersion           1.1.0.1  

我尝试在 -ScriptBlock 之前和之后放置测试以捕获其他错误,但整个 -ScriptBlock 似乎根本没有运行。

例如,我的设置中当前可以使用以下内容:

Start-Job -ScriptBlock {
   New-Item -Path 'c:\ivanti-patch-automation\logs\tempfile.txt' -ItemType File
} | Wait-Job

文件已正确创建。

以下不起作用。唯一的变化是删除管道命令 Wait-Job。

Start-Job -ScriptBlock {
   New-Item -Path 'c:\ivanti-patch-automation\logs\tempfile.txt' -ItemType File
}

我希望两者都能工作,但我不确定为什么等待工作完成会影响它是否工作。

【问题讨论】:

  • 开始工作后您的 PowerShell 会话在做什么?执行其他命令,返回提示符还是直接终止?
  • 最合适的评论,我会赞成但还没有足够的声誉。谢谢 PetSerAl。

标签: powershell start-job


【解决方案1】:

嗯,我无法重现这个。但我在5.1。您可以尝试将脚本块放入变量中并将其传递给作业。喜欢

$ScriptBlock = {
   New-Item -Path 'c:\ivanti-patch-automation\logs\tempfile.txt' -ItemType File
}

Start-Job -ScriptBlock $ScriptBlock

看看这是否创造了一份工作。

【讨论】:

    【解决方案2】:

    添加-force:

    Start-Job -ScriptBlock {
       New-Item -Path 'c:\ivanti-patch-automation\logs\tempfile.txt' -ItemType File -force
    }
    

    【讨论】:

      【解决方案3】:

      我在几分钟前发现了答案。 PetSerAI 的第一条评论暗示了一点,虽然我后来通过研究自己找到了答案。

      在这种情况下,父 PS 会话 (a) 正在通过 Start-Job 启动后台作业 (b)。作业 (b) 正在开始,但在它有机会处理作业 (b) 中的第一行之前,父 PS 会话 (a) 已继续,完成它的运行并完全终止该会话。由于从 PS 会话生成的作业通常不会超过其父级,因此我启动的子后台作业 (b) 立即终止,并且从未处理过其中的任何一行。

      这也是为什么等待子作业似乎可以暂时解决问题的原因。

      鉴于这是问题所在,在我的情况下,以任何比父级更持久的方式创建后台作业都可以解决这个问题。我将继续使用 Start-Process 来生成一个新的 PowerShell 进程,该进程将比父进程更持久。这应该可以解决我的问题。

      【讨论】:

      • 一旦锁定计时器结束,我将接受此作为正确答案。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多