Powershell 工作在做,自己停止工作

Powershell 工作在做,自己停止工作,powershell,jobs,Powershell,Jobs,只是在这里寻找验证。一个作业能阻止作业本身吗?我有一个脚本,它创建一个作业,在主脚本运行期间(通过传递$PID)抑制服务,我当前正在使用这个脚本 Start-Job -name:'SuppressAdAppMgrSvc' -argumentList $id -scriptBlock { param ( $id ) do { if ((Get-Service AdAppMgrSvc -errorAction:silentlyContinue

只是在这里寻找验证。一个作业能阻止作业本身吗?我有一个脚本,它创建一个作业,在主脚本运行期间(通过传递$PID)抑制服务,我当前正在使用这个脚本

Start-Job -name:'SuppressAdAppMgrSvc' -argumentList $id -scriptBlock {
    param (
        $id
    )

    do {
        if ((Get-Service AdAppMgrSvc -errorAction:silentlyContinue).Status -eq 'Running') {
            Stop-Service AdAppMgrSvc -force -warningAction:silentlyContinue -errorAction:silentlyContinue
        }

        Start-Sleep -s 5
        $powershellProcess = Get-Process -id:$id -errorAction:silentlyContinue
    } while ($powershellProcess)

    Stop-Job 'SuppressAdAppMgrSvc' -warningAction:silentlyContinue -errorAction:silentlyContinue
    Remove-Job 'SuppressAdAppMgrSvc' -warningAction:silentlyContinue -errorAction:silentlyContinue

我的想法是作业将运行,当
$powershell进程
不再运行时,
停止作业
将运行。但是我怀疑
删除作业
不会,因为这正是刚刚停止的作业。一般来说,这可能不是问题,因为99%的时间我都是在脚本完成后重新启动的,但我很好奇是否有一种模式可以处理这个问题?或者这是一种边缘情况?

您如何期望
删除作业
在停止的作业中运行?你为什么一开始就想在工作中做到这一点

当scriptblock中的代码终止时,作业将自动进入
Stopped
状态,因此您只需等待该状态发生,然后删除作业:

Start-Job -Name 'SuppressAdAppMgrSvc' -ArgumentList $id -ScriptBlock {
  ...
} | Wait-Job | Remove-Job

您如何期望
删除作业
在已停止的作业中运行?你为什么一开始就想在工作中做到这一点

当scriptblock中的代码终止时,作业将自动进入
Stopped
状态,因此您只需等待该状态发生,然后删除作业:

Start-Job -Name 'SuppressAdAppMgrSvc' -ArgumentList $id -ScriptBlock {
  ...
} | Wait-Job | Remove-Job

事实上,我认为这项工作永远不会发生,这就是问题所在。我的脚本运行,启动作业,只要脚本运行,作业就会继续抑制服务,如果脚本正确完成,则会进行清理。但是,如果脚本通过干预或崩溃提前终止,我的作业将停止抑制服务,这很好,作业将完成。但这会在工作清单上留下一些碎片,我不喜欢。这种情况很少见,但我想如果有办法解决的话,我会的。不需要停车也是一个很好的观点。事实上,我认为删除工作永远不会发生,这就是问题所在。我的脚本运行,启动作业,只要脚本运行,作业就会继续抑制服务,如果脚本正确完成,则会进行清理。但是,如果脚本通过干预或崩溃提前终止,我的作业将停止抑制服务,这很好,作业将完成。但这会在工作清单上留下一些碎片,我不喜欢。这种情况很少见,但我想如果有办法解决的话,我会的。不需要停车也很好。