【问题标题】:PowerShell Get-Netadapter hangsPowerShell Get-Netadapter 挂起
【发布时间】:2016-10-28 05:24:10
【问题描述】:

我有一个在启动时运行的 PowerShell 脚本。它专为在 Raspberry Pi3 上运行的小型站点服务器而设计。

它所做的其中一件事是重置网络设置。然而,以下命令在某些情况下会挂起。

$Adapter = Get-NetAdapter | ? {$_.Status -eq "up"}
$Interface = $Adapter | Get-NetIPInterface -AddressFamily "IPv4"
$Interface | Set-NetIPInterface -DHCP Enabled | Out-Null
$Interface | Set-DnsClientServerAddress -ResetServerAddresses | Out-Null

我正在寻找有关它为什么会挂起的任何帮助,一种将网络适配器重置为 DHCP 的不同编码方式,或者我可以捕获挂起的方式(它不会出错)

【问题讨论】:

  • 它通常挂在上面几行的第一行或最后一行。
  • 您是否以管理员身份运行?
  • 是的。这是一个以管理员身份运行的计划任务。它有时有效,但其他没有变化。
  • 如果通过 powershell 作为脚本调用,确切的脚本可以正常工作。它仅通过计划任务引起问题。

标签: powershell raspberry-pi windowsiot


【解决方案1】:

你没有说你正在(正在)运行什么操作系统,但我假设是 Windows,因为你没有提到 dotNet Core

这可能是 CIM-vs-WMI 问题,尤其是在您查询 Pi 上的硬件属性时。使用Get-WMIObject 可能会得到更好的结果:

Get-WmiObject -Class "Win32_NetworkAdapter" -Filter "NetConnectionStatus=2"

【讨论】:

    【解决方案2】:

    尚未在 Raspberry Pi 上尝试过此操作,但您可以将此逻辑转换为 ScriptBlock 并将其作为作业(也称为子进程)运行,您可以监控它的完成情况,如果耗时过长则终止/重试。

    示例代码:

    $ResetAdapter = {
        ... your code here ...
    }
    
    $job = Start-Job -Name ResetAdapter -ScriptBlock $ResetAdapter
    
    do {
      Start-Sleep -Seconds 1
    
      $Elapsed = ((Get-Date)-$job.PSBeginTime).TotalSeconds
    } while (($job.State -eq "Running") -and ($Elapsed -lt 60))
    
    if($job.State -eq "Running"){
      Stop-Job $job
      Remove-Job $job
    
      # try again?
    }
    

    【讨论】:

    • 我试过了。还尝试在不同的线程中调用单独的 ps1 文件。无论我尝试什么,它都会挂起。 Powershell.exe 进程正在运行并处于 25% 左右,因此我假设正在发生某些事情,但无法确认是什么。
    • 您可能需要进行一些调试(记录到文件?)以确认脚本挂起的时间和位置。
    • 我是。它只会挂在 get-netadapater 上。如果通过 powershell 手动调用,确切的脚本没有问题。只有通过计划任务调用它才会有问题。任务管理器将任务显示为具有 25% CPU 的 powershell.exe。我最终放弃并使用了 Linux。
    • 我知道这种感觉。刚刚添加了另一个答案。很可能您无法再进行测试,但其他人可能会偶然发现这个......
    猜你喜欢
    • 1970-01-01
    • 2014-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-13
    • 2021-08-04
    • 2014-08-09
    相关资源
    最近更新 更多