【问题标题】:Terminate part of powershell script and continue终止部分 powershell 脚本并继续
【发布时间】:2018-04-06 02:10:25
【问题描述】:

我制作了一个 powershell 脚本,它读取远程 PC 的注册表项,并将它们打印到一个 html 页面。

有时远程 PC 会冻结/挂起等。这会将每台冻结的 PC 的最终 html 页面增加约 40 秒。

我怎样才能对脚本的一部分进行计时,比如 1-2 个命令,如果时间过长,我会终止该命令并继续使用 PC 名称数组中的下一台 PC 执行脚本? 或者解决方案不及时,还有其他方法吗?谢谢!

像这样的:

$Reg = [Microsoft.Win32.RegistryKey]::OpenRemoteBaseKey('Users', $remote[$i]) + timer 并行运行 + if condition 用于计时器计数。而当计数器达到阈值terminate OpenRemoteBaseKey & continue

【问题讨论】:

  • 在 powershell 中输入:Get-Help about_Jobs

标签: powershell


【解决方案1】:

将语句作为作业执行。监控工作之外的时间。如果作业运行的时间比您喜欢的要长,请终止它。

$job = Invoke-Command `
  -Session $s
  -ScriptBlock { $Reg = [Microsoft.Win32.RegistryKey]::OpenRemoteBaseKey('Users', $remote[$i]) } `
  -AsJob `
  -JobName foo

$int = 0

while (($job.State -like "Running") -and ($int -lt 3)) {
  Start-Sleep -Seconds 1
  $int++
}

if ($Job.State -like "Running") { $job | Stop-Job }

【讨论】:

  • 我认为,这是正确的轨道,只是错误的火车。我花了一天的大部分时间来完成这项工作。出于某种原因,我没有在脚本块内分配变量,即$Reg = [Microsoft.Win32.RegistryKey] 始终为空。当我运行$Reg = invoke-command -scriptblock {receive-job -job $job} 时,我让它在某个时候工作,但它只在某些时候工作。其他时候作业处于“完成”状态,但没有输出。有什么线索吗?
  • 您将变量传递给由 Invoke-Command 执行的脚本块,作为脚本块的参数。调用命令 -Scriptblock { $x = $args[0]; ... } -ArgumentList $foo。查看帮助页面了解更多详情。
  • 没有看到你的代码,我只是在抛出飞镖,为什么它不能始终如一地工作。我可能会使用一些 Write-Host 调用来跟踪块中值的状态。也许将其作为一个单独的问题打开。
  • 我想我会问一个关于工作的不同问题。真的被这个困住了。不管怎么说,还是要谢谢你!找到工作后,我会回到这里;)
猜你喜欢
  • 2015-04-24
  • 1970-01-01
  • 1970-01-01
  • 2013-02-16
  • 2019-07-30
  • 2020-03-21
  • 2014-01-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多