我有一个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
}
我希望既能工作,又不确定为什么等待工作完成会影响它是否起作用。
答案 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进程,该进程将比父进程持久。这应该为我解决了这个问题。