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