Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Powershell正在调用psexec,脚本将停止,直到psexec完成,需要在时间之前中断_Powershell_Break_Psexec - Fatal编程技术网

Powershell正在调用psexec,脚本将停止,直到psexec完成,需要在时间之前中断

Powershell正在调用psexec,脚本将停止,直到psexec完成,需要在时间之前中断,powershell,break,psexec,Powershell,Break,Psexec,我有以下代码: 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 $prog

我有以下代码:

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"
       
       }
这是脚本的一部分,我们用来在客户端pc上远程安装程序。 很好,只有一个问题: 脚本在完成每个psexec行之前不会继续。该脚本允许最终用户使用管理员权限安装程序,它是交互式安装,因此用户需要在计算机上。 如果出于某种原因,一个用户调用了脚本,然后去喝咖啡,那么脚本将一直处于停滞状态,直到用户返回并继续安装。 我想做的是一个检查-如果出于某种原因,其中一个psexec行需要超过2分钟,我想退出psexec部分并继续代码

我怎样才能做到这一点呢?

如前所述,开始工作是解决您问题的可行方法。使用“启动作业”将允许您启动并监视作业的进度/状态

    $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()

        }
       
    }
如前所述,开始工作是解决你问题的可行办法。使用“启动作业”将允许您启动并监视作业的进度/状态

    $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()

        }
       
    }

您可以使用
start job
不等待它们中的任何一个。不幸的是,这对脚本不好,因为一个psexec行依赖于另一个psexec行,主要目标是等待X分钟,如果脚本发现某个东西卡在psexec的某一行中,我想让它对此做点什么,那么在循环之前执行
do
怎么样?
$TimeStart=Get Date$TimeEnd=$TimeStart.addminutes(2)Write Host“Start Time:$TimeStart”Write Host“End Time:$TimeEnd”do{$TimeNow=Get Date if($TimeNow-ge$TimeEnd){Write host“该完成了。”}否则{Write host“还没有完成,只有$TimeNow”}开始睡眠-秒10}直到($TimeNow-ge$TimeEnd)
psexec将在远程计算机上打开安装,发生这种情况时,脚本将仅在远程计算机上完成安装后继续,如果远程计算机上的用户不执行任何操作,这意味着安装将在远程计算机上停止,则脚本将不会继续。我需要找到一种方法在远程计算机上继续r X分钟,即使最终用户不在他的计算机上。就像psexec脚本块的时间计数器。10分钟后,从块中断并继续。您可以使用
start job
不等待它们中的任何一个。不幸的是,这对脚本不好,因为一个psexec行依赖于另一行,主要目标类似于等待X数量of分钟,如果脚本发现某个东西卡在psexec的某一行中,我希望它对此做些什么
do
直到
循环怎么样?
$TimeStart=Get Date$TimeEnd=$TimeStart.addminutes(2)Write Host“Start Time:$TimeStart”Write Host“End Time:$TimeEnd”do{$TimeNow=Get Date if($TimeNow-ge$TIMEND){Write host“该完成了。”}否则{Write host“还没有完成,只有$TimeNow”}开始睡眠-秒10}直到($TimeNow-ge$TIMEND)
psexec将在远程计算机上打开安装,发生这种情况时,脚本将仅在远程计算机上完成安装后继续,如果远程计算机上的用户不执行任何操作,这意味着安装将在远程计算机上停止,则脚本将不会继续。我需要找到一种方法在远程计算机上继续r X分钟,即使最终用户不在他的计算机上。就像psexec脚本块的时间计数器。10分钟后,从块中断并继续。如果作业成功完成,我建议添加
$job |删除作业
;如果超过超时,则建议添加
$job |删除作业-强制
,因此作业将被强制终止。在答案中添加了@zett42的建议。谢谢zett42。我建议在作业成功完成的情况下添加
$job |删除作业
,在超过超时的情况下添加
$job |删除作业-强制
,这样作业将被强制终止。在答案中添加了@zett42的建议。谢谢zett42。