Основанный на времени цикл - PullRequest
1 голос
/ 14 октября 2019

Я пытался заставить цикл while & If правильно считывать время, но он не завершает программу, когда наступило нужное время. Я пытался использовать одинарные кавычки '' и двойные кавычки "", а также различный синтаксис, такой как (-eq, -match, -ne), чтобы увидеть, работают ли какие-либо из них .... и они не.

Цель программы: зацикливание до 07:00

# While the value is 1.
while ($value -ne 2)
{   
    # Value should be 1 in order to stay in loop.
    $value = 1

    # Get's the time in 24hr format
    $time = get-date -Format HH:mm:ss

    # For Debugging; Writes out Time
    Write-Output $time

    # Creates a Pop-Up Windows that prevents the computer from timing out; runs every 15 minutes.
    $wshell = New-Object -ComObject Wscript.Shell

    $wshell.Popup("Operation Completed",0,"Done",0x1)

    # Causes the Program to wait to send the Enter Keystroke.
    Sleep 4

    # Sends the Enter Keystroke.
    $wshell.sendkeys('~')

    # Causes the Program to wait to send the Enter Keystroke in seconds (900sec = 15 Minutes).
    Sleep 4

    # If Condition; If the time is over 2am then the program quits.
    If ($time -eq "02:03:00")
    {
        # While Loop End Condition
        $value = 2

        # "Debugging Output"
        Write-Output $value
        Write-Output $time
    }

    Else
    {
        # While Loop Condition
        $value = 1

        # "Debugging Output"
        Write-Output $value
        Write-Output $time
    }
}

# "Debugging Output"
Write-Output "End"
Write-Output $time
Write-Output $value

Ответы [ 3 ]

2 голосов
/ 14 октября 2019

Шансы, что ваше if-утверждение станет правдой, очень малы. Потому что ваш цикл while занимает не менее 8 (2x Start-Sleep и другие работы) секунды до нового начала. Это означает, что переменная $ time, вероятно, никогда не будет точно 02:03:00. В этом случае я бы не пошел на точное время. Вместо этого я бы проверил, было ли это 02:03:00 или позже. Попробуйте это:

$time = Get-Date

if ($time -ge (Get-Date -Hour 02 -Minute 03 -Second 00))
{
}
1 голос
/ 14 октября 2019

Это условие должно выполнять работу:

if ((Get-Date) -gt (Get-Date -Hour 7 -Minute 0 -Second 0)) {
  # While Loop End Condition
  $value = 2
  # more actions 
}

Он сравнивает текущее время с объектом DateTime с текущим днем, но время установлено на 07:00:00.

Сохранить вИмейте в виду две вещи:

  1. Это позволит циклу работать только с полуночи до 7 утра. Если вы хотите запустить скрипт за день до того, как вам нужно будет откорректировать условия.

  2. Возможно, будет удобнее читать, если вы не используете if, но поместите условие непосредственно в while()как это:

while ((Get-Date) -lt (Get-Date -Hour 7 -Minute 0 -Second 0)) {
  # do something
}

В настоящее время вы проверяете точное время, поэтому в теории конечное условие может быть выполнено, однако, если оно достигнетопределенная строка за одну секунду до / после, она не остановит цикл.

0 голосов
/ 14 октября 2019

Законченный код (по крайней мере, эта версия в любом случае). Цените помощь тоже:)!

<### 

    Program Goal: Prevent PC Timeout/Sleep; also loops until it hits 07:00am 
    Date: 10/14/19
    Version: 1.2

###>

# Creates a Pop-Up Windows that prevents the computer from timing out; runs every 15 minutes.
$wshell = New-Object -ComObject Wscript.Shell

# Get's the time in 24hr format
$time = get-date

# While the value is not equal to 2.
while ($value -ne 2)
{   
    # Value should be 1 in order to stay in loop.
    $value = 1

    $wshell.Popup("Operation Completed", 5,"Done", 1)

    # Causes the Program to wait to send the Enter Keystroke.
    Sleep 2

    # If Condition; If the time is over 7am then the program quits.
    if ((Get-Date) -gt (Get-Date -Hour 7 -Minute 0 -Second 0)) 
    {
        # While Loop End Condition
        $value = 2
    }

    else
    {
        # While Loop Condition
        $value = 1

        # Causes the Program to wait (900sec = 15 Minutes) to prevent PC Timeout, will re-run again after Sleep.
        Sleep 900
    }

}

# Cleans up the COM Object
[System.Runtime.Interopservices.Marshal]::ReleaseComObject($wshell) | Out-Null
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...