Скрипт Powershell предотвращает простой компьютера

У меня проблема, и я не очень хорошо разбираюсь в PowerShell, чтобы знать, есть ли обходной путь для этого или я делаю что-то неправильно. В общем, я хотел, чтобы мой компьютер (W11) не простаивал всякий раз, когда я подключался к некоторым из размещенных мной сервисов (все через Tailscale, если это имеет значение), сохраняя при этом 30-минутный таймер сна, который у меня обычно есть, когда он не подключен. Дело в том, что после создания скрипта и всего, что я понял, компьютер просто не простаивает и не переходит в спящий режим, когда я им больше не пользуюсь (изменения таймера сна работают, этот скрипт просто держит компьютер в бодрствующем состоянии в любом случае). Сначала я думал, что это пинг моего клиента мешает простою, но, по-видимому, это фактическая проверка соединения или, может быть, использование PowerShell вообще? Python и мои другие сервисы, похоже, не предотвращают простоя компьютера. Итак, есть ли способ заставить этот скрипт работать, позволяя моему компьютеру спать, пока скрипт проверяет наличие соединения? Или есть лучший способ добиться этого? Я сделал это с помощью powershell, так как это родная штука для windows. Вот code:

Спасибо заранее.

Я пытался комментировать code ping, но безуспешно, компьютер все равно не спит.

#Function to load IP addresses from the clients file
function Load-Clients {
    param (
        [string]$filePath
    )
    return Get-Content -Path $filePath
}

#Load IP addresses from the clients file
$clientsFilePath = "$PSScriptRoot\..\clients"
$deviceIPs = Load-Clients -filePath $clientsFilePath

$interval = 60 # Check every 60 seconds when no connections
$shortInterval = 30 # Check every 30 seconds when the device is reachable
$longInterval = 1800 # Check every 30 minutes when connections are detected
$portsToCheck = @(8000, 7860, 5000, 5001, 80) # List of ports to check for connections
$originalTimeout = 30 # Original sleep timeout in minutes
$sleepTimerDisabled = $false

while ($true) {
    # $deviceReachable = $false

    # foreach ($deviceIP in $deviceIPs) {
    #     $pingResult = Test-Connection -ComputerName $deviceIP -Count 1 -Quiet
    #     if ($pingResult) {
    #         Write-Output "Device $deviceIP is reachable."
    #         $deviceReachable = $true
    #         break
    #     } else {
    #         Write-Output "Device $deviceIP is not reachable."
    #     }
    # }

    # if ($deviceReachable) {
    #     Write-Output "Device is reachable. Checking connections every 30 seconds."
    #     $checkInterval = $shortInterval
    # } else {
    #     Write-Output "Device is not reachable. Checking connections every 60 seconds."
    #     $checkInterval = $interval
    # }

    # Default to checking every 60 seconds since ping functionality is commented out
    $checkInterval = $interval

    $activity = 0

    foreach ($port in $portsToCheck) {
        $activity += (Get-NetTCPConnection -State Established | Where-Object { $_.LocalPort -eq $port }).Count
    }

    Write-Output "Connections detected: $activity"

    if ($activity -gt 0) {
        if (!$sleepTimerDisabled) {
            # Disable the sleep timer
            powercfg /change standby-timeout-ac 0
            $sleepTimerDisabled = $true
            Write-Output "Sleep timer disabled. Waiting for 30 minutes."
        }
        # Wait for 30 minutes
        Start-Sleep -Seconds $longInterval
    } else {
        if ($sleepTimerDisabled) {
            # Revert to the original sleep timer
            powercfg /change standby-timeout-ac $originalTimeout
            $sleepTimerDisabled = $false
            Write-Output "No connections detected. Sleep timer reverted to original."
        }
        Write-Output "Waiting for $checkInterval seconds."
        # Wait for the specified interval
        Start-Sleep -Seconds $checkInterval
    }
}
Лидия
Вопрос задан12 мая 2024 г.

1 Ответ

2
Элеонора
Ответ получен3 сентября 2024 г.

Ваш ответ

Загрузить файл.