仅当我等待完成时,开始作业才运行

时间:2019-06-06 17:14:58

标签: powershell start-job

我有一个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
}

我希望既能工作,又不确定为什么等待工作完成会影响它是否起作用。

3 个答案:

答案 0 :(得分:0)

嗯,我无法复制此内容。但是我是5.1。您可以尝试将脚本块放入变量中并将其传递给作业吗?喜欢

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

Start-Job -ScriptBlock $ScriptBlock

看看是否能创造工作。

答案 1 :(得分:0)

添加-force:

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

答案 2 :(得分:0)

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

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

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

鉴于此,在我的情况下,以比父母更长的时间创建后台作业将解决此问题。我将继续使用Start-Process来生成一个新的PowerShell进程,该进程将比父进程持久。这应该为我解决了这个问题。