我已经创建了一个脚本来重新启动一个预定的时间段。不幸的是,它正在检查我遇到CPU使用问题的时间。它只是运行并运行(假设这是while循环的本质)。我正在寻找更好的方法来做到这一点。Powershell循环和优化
所以基本上我把它设置有次它会查找,例如: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
**是的,有可能是其他错误,我正在通过最明显的一个先工作然后将其他人。
如果您只想在特定时间执行任务,为什么不使用计划任务而是在您想要的时间触发。 – 2014-10-07 18:44:58
我曾希望创建一个独立于Windows任务调度器的独立脚本,但您可能是对的,因为这将是实现它的最佳方式。 – 2014-10-07 18:48:08