如何解决Powershell 调用 psexec,脚本将暂停,直到 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 $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 行之前不会继续。该脚本让最终用户以管理员权限安装程序,它是交互式安装,因此用户需要在计算机上。 如果由于某种原因,一个用户调用脚本,然后去喝咖啡,脚本将保持卡住,直到用户返回并继续安装。 我想要做的是检查 - 如果由于某种原因 psexec 行之一花费了超过 2 分钟,我想退出 break 中断 psexec 部分并继续代码。
我怎样才能做到这一点?
解决方法
正如 Abraham 提到的,Start-Job 是解决您问题的可行方案。使用 Start-Job 将允许您启动和监控作业的进度/状态。
$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()
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。