Loops Powershell循环和While优化
我已经创建了一个脚本,可以在预定的时间段重新启动。不幸的是,当它检查我遇到cpu使用问题的时间时。它只是不断地运行(假设这是while循环的本质)。我正在寻找一种更好的方法 所以基本上我把它设置成有它要找的时间,例如:12:00 然后我运行一段时间,它一直运行到12:00,然后执行一些操作并再次运行到下一个时间间隔 有趣的是,当我创建这个程序时,我没有想到它会占用资源,而且效率极低 所以我的问题是,如果我想在一定的时间间隔内重新启动某个东西,但又不想让它每秒钟/毫秒检查一次,我该怎么办 这将是重新启动gameserver进程,时间非常关键,因为人们在游戏中需要警告 我将包括脚本的可行性Loops Powershell循环和While优化,loops,powershell,time,while-loop,Loops,Powershell,Time,While Loop,我已经创建了一个脚本,可以在预定的时间段重新启动。不幸的是,当它检查我遇到cpu使用问题的时间时。它只是不断地运行(假设这是while循环的本质)。我正在寻找一种更好的方法 所以基本上我把它设置成有它要找的时间,例如:12:00 然后我运行一段时间,它一直运行到12:00,然后执行一些操作并再次运行到下一个时间间隔 有趣的是,当我创建这个程序时,我没有想到它会占用资源,而且效率极低 所以我的问题是,如果我想在一定的时间间隔内重新启动某个东西,但又不想让它每秒钟/毫秒检查一次,我该怎么办 这将是重
$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秒,它仍然应该正确捕捉它。谢谢,我不知道为什么我没有想到这个。