Powershell 调用 psexec,脚本将暂停,直到 psexec 完成,需要按时间中断

Powershell calling psexec, script will halt until psexec is done, need to break this by time

我有以下代码:

foreach ($program in $programlist){
        "$line installed $program" | Out-File "$logpath\log.txt" -Append

        psexec \"$hostikname" -u bla\bla -p $plainpwd cmd /c "pushd $BucketPath & copy $program c:\programdata\"
        psexec \"$hostikname" -i -u bla\bla -p $plainpwd -h cmd /c  "c:\programdata$program"
        psexec \"$hostikname" -u bla\bla -p $plainpwd cmd /c "del c:\programdata$program"
       
       }

这是我们用来在客户端电脑上远程安装程序的脚本的一部分。 效果很好只有一个问题: 脚本在完成每个 psexec 行之前不会继续。该脚本让最终用户以管理员权限安装程序,它是交互式安装,因此用户需要在计算机上。 如果出于某种原因,一个用户调用脚本,然后去喝杯咖啡,脚本将一直卡住,直到用户 return 并继续安装。 我想做的是检查 - 如果由于某种原因其中一个 psexec 行花费了超过 2 分钟,我想退出 break 中断 psexec 部分并继续代码。

我怎样才能做到这一点?

正如 Abraham 提到的,Start-Job 是解决您的问题的可行方法。使用 Start-Job 将允许您启动和监视作业的 progress/state.

    $allowedSecondsForCompletion = 120
    foreach ($program in $programlist) {
        "$line installed $program" | Out-File "$logpath\log.txt" -Append
    
        $timer = [System.Diagnostics.Stopwatch]::StartNew()
        $job = Start-Job -ScriptBlock {  
            psexec \"$hostikname" -u bla\bla -p $plainpwd cmd /c "pushd $BucketPath & copy $program c:\programdata\"
            psexec \"$hostikname" -i -u bla\bla -p $plainpwd -h cmd /c "c:\programdata$program"
            psexec \"$hostikname" -u bla\bla -p $plainpwd cmd /c "del c:\programdata$program"
        }
        
        while ($job.state -eq 'Running' -and $timer.ElapsedMilliseconds -lt ($allowedSecondsForCompletion * 1000))
        {
            start-sleep -Seconds 5
        }
    
        if ($job.State -ne 'Completed') {
            # check and Log failure
            
            # Terminate job if still running
            $job | Remove-Job -Force
            # or $job.StopJob()

        }
       
    }