Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Loops Powershell循环和While优化_Loops_Powershell_Time_While Loop - Fatal编程技术网

Loops Powershell循环和While优化

Loops Powershell循环和While优化,loops,powershell,time,while-loop,Loops,Powershell,Time,While Loop,我已经创建了一个脚本,可以在预定的时间段重新启动。不幸的是,当它检查我遇到cpu使用问题的时间时。它只是不断地运行(假设这是while循环的本质)。我正在寻找一种更好的方法 所以基本上我把它设置成有它要找的时间,例如:12:00 然后我运行一段时间,它一直运行到12:00,然后执行一些操作并再次运行到下一个时间间隔 有趣的是,当我创建这个程序时,我没有想到它会占用资源,而且效率极低 所以我的问题是,如果我想在一定的时间间隔内重新启动某个东西,但又不想让它每秒钟/毫秒检查一次,我该怎么办 这将是重

我已经创建了一个脚本,可以在预定的时间段重新启动。不幸的是,当它检查我遇到cpu使用问题的时间时。它只是不断地运行(假设这是while循环的本质)。我正在寻找一种更好的方法

所以基本上我把它设置成有它要找的时间,例如:12:00

然后我运行一段时间,它一直运行到12:00,然后执行一些操作并再次运行到下一个时间间隔

有趣的是,当我创建这个程序时,我没有想到它会占用资源,而且效率极低

所以我的问题是,如果我想在一定的时间间隔内重新启动某个东西,但又不想让它每秒钟/毫秒检查一次,我该怎么办

这将是重新启动gameserver进程,时间非常关键,因为人们在游戏中需要警告

我将包括脚本的可行性

$CurrentTime = Get-Date -UFormat "%R"

$debug = "true" 

$Times = "12:00", "13:00", "01:00", "14:12"
$servers = "Notepad"
$aff = "C4", "38"  

$scriptRun = 0
$serverCount = 1

$startedServers

$loop = 1

function checkServers 
{
    if ($debug -eq "true") { Write-Output "Entering Loop ::: $loop" }
    while($loop -eq 1) 
    {

    if ($CurrentTime -eq $Times[1] -or $CurrentTime -eq $Times[2] -or $CurrentTime -eq $Times[3] -or $CurrentTime -eq $Times[4]) 
    {
        stopServers
        foreach($i in $servers)
        {
            if ($debug -eq "true") { Write-Output "The Server being started is $server" }
            startServer( [ref]$servers[$i] )
        }
        $loop = 0
    } else {
        $loop = 1
        checkServers
    }
    }
}

function waits 
{
    Start-Sleep -seconds 61
    $loop = 1
    checkServers
}

function stopServers 
{
    if ($scriptRun -eq 1)
    {
        foreach ($i in $startedServers)
        {
            Stop-Process -processname $startedServers[$i]
            Write-Output "$startedServers[$i] has been stopped"  
        }
    } else {
    Write-Output "Starting Servers for the first time"
    }   
}

function startServer( [ref]$server ) 
{
    $server = $server 

    Start $server 
    $s = "$server.exe"
    $instances = Get-Process $s

    foreach ($s in $instances) {
        $s.ProcessAffinity = $aff[$serverCount]
        $serverCount = $serverCount + 1 
    }

    if ($scriptRun -eq 0) {
        $startedServers += $s
        $scriptRun = 1 
    }
    waits
    Write-Output "$server was successfully started at $CurrentTime" 
}

Write-Output "Starting RestartServer at $CurrentTime"
checkServers

**是的,可能还有其他错误,我正在处理最明显的错误,然后再处理其他错误

只要检查不是CPU密集型的,每秒检查一次就不是什么大问题。然而,当你有一个严密的循环,不断地检查-这是一个问题。只要加入一个Start Sleep-sec 1或Start Sleep-Milli 500,就可以显著减轻CPU的负载。您还可以使用计划作业在预定时间运行脚本。

只要检查不是CPU密集型的,每秒检查一次并不是什么大问题。然而,当你有一个严密的循环,不断地检查-这是一个问题。只要加入一个Start Sleep-sec 1或Start Sleep-Milli 500,就可以显著减轻CPU的负载。您还可以使用计划作业在预先确定的时间运行脚本。

如果您只想在特定时间执行任务,为什么不使用计划任务,而只是在您想要的时间触发。我希望创建一个独立于windows任务计划程序的脚本,但你可能是对的,这是最好的方法。如果你只想在特定时间执行任务,为什么不使用计划任务,而只是在你想要的时间触发。我希望创建一个独立于windows任务计划程序的脚本,但你可能是对的,这是最好的方法。从技术上讲,这是可行的,因为它不检查秒数,我甚至可以扩展它,只检查每55秒一次,它仍然应该正确捕捉它。谢谢,我不知道为什么我没有想到这一点。从技术上讲,这是可行的,因为它不检查秒数,我甚至可以扩展它,只检查每说55秒,它仍然应该正确捕捉它。谢谢,我不知道为什么我没有想到这个。