Powershell 仅当我等待完成时,启动作业才会运行

Powershell 仅当我等待完成时,启动作业才会运行,powershell,start-job,Powershell,Start Job,我有一个启动作业脚本块,如果我等待作业完成,它将正确运行。如果我没有等待/接收作业完成状态,-ScriptBlock不会运行。我不确定我错过了什么。可能不了解PS背景工作的基本行为 这是在Win 2012R2服务器上运行的。以下是我的$PSVersionTable转储: Name Value ----

我有一个启动作业脚本块,如果我等待作业完成,它将正确运行。如果我没有等待/接收作业完成状态,-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
文件已正确创建

以下方法不起作用。唯一的更改是删除管道命令等待作业

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

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

嗯,我无法重现这一点。但我在5.1上。可以尝试将scriptblock放入变量并将其传递给作业吗。像

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

Start-Job -ScriptBlock $ScriptBlock

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

嗯,我无法重现这一点。但我在5.1上。可以尝试将scriptblock放入变量并将其传递给作业吗。像

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

Start-Job -ScriptBlock $ScriptBlock
查看是否创建了作业。

添加-强制:

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

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

几分钟前我发现了答案。佩瑟莱的第一句话有点暗示了这一点,尽管后来我通过研究自己找到了答案

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

这也是为什么等待孩子的工作似乎暂时解决了这个问题


考虑到这一点,在我的案例中,以任何方式创建后台工作都可以解决这个问题。我将继续使用Start Process来生成一个新的PowerShell进程,它将比父进程更持久。这应该可以解决我的问题。

我几分钟前发现了答案。佩瑟莱的第一句话有点暗示了这一点,尽管后来我通过研究自己找到了答案

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

这也是为什么等待孩子的工作似乎暂时解决了这个问题


考虑到这一点,在我的案例中,以任何方式创建后台工作都可以解决这个问题。我将继续使用Start Process来生成一个新的PowerShell进程,它将比父进程更持久。这应该可以解决我的问题。

启动作业后,您的PowerShell会话在做什么?执行其他命令,返回提示符,或者它只是终止?最合适的评论,我会投票,但还没有足够的声誉。谢谢PetSerAl。开始工作后,你的PowerShell会话在做什么?执行其他命令,返回提示符,或者它只是终止?最合适的评论,我会投票,但还没有足够的声誉。谢谢PetSerAl。一旦锁定计时器启动,我将接受这一正确答案。一旦锁定计时器启动,我将接受这一正确答案。