Loops 将if循环留在while循环中
我正在编写一个PowerShell脚本,它不断检查我正在运行的游戏服务器的状态,并且根据某些exe和变量的状态,某些事情会发生。我构造这个的方式是,首先我有一个计时器启动,我有一个while循环,它一直运行到计时器达到280秒。在这个while循环中有一系列if-than-else语句,它们查看前面提到的所有变量和exe的状态,然后执行不同的操作。我想要的是,当它到达一个条件的末尾时(如果找不到exe,服务器状态为0),然后给我发送电子邮件,然后返回整个Loops 将if循环留在while循环中,loops,powershell,Loops,Powershell,我正在编写一个PowerShell脚本,它不断检查我正在运行的游戏服务器的状态,并且根据某些exe和变量的状态,某些事情会发生。我构造这个的方式是,首先我有一个计时器启动,我有一个while循环,它一直运行到计时器达到280秒。在这个while循环中有一系列if-than-else语句,它们查看前面提到的所有变量和exe的状态,然后执行不同的操作。我想要的是,当它到达一个条件的末尾时(如果找不到exe,服务器状态为0),然后给我发送电子邮件,然后返回整个的开头,而循环并继续循环并检查服务器的状态
的开头,而循环并继续循环并检查服务器的状态
以下是当前在中的脚本:
//$serverStatus = 1 means servers up, 0 means down, 3 means crashed
$timeout = new-timespan -Seconds 280
$sw = [diagnostics.stopwatch]::StartNew()
while ($sw.elapsed -lt $timeout){
Start-Sleep -Seconds 10
if (((get-process $process -ea SilentlyContinue) -eq $Null) -And ($serverStatus -eq "1")) {
#Server is down and email
"0" > "D:\Ark Scripts\serverStatus.txt"
Write-Host "it's down - email"
sendMail -sendTo "my email" -emailBody "Ark Server is down."
} elseif (((get-process $process -ea SilentlyContinue) -eq $Null) -And ($serverStatus -eq "0")) {
#Server is down and we are aware
Write-Host "it's down - we know"
} elseIf (((get-process $process -ea SilentlyContinue) -ne $Null) -And ($serverStatus -eq "0")) {
#Server is up and email
"1" > "D:\Ark Scripts\serverStatus.txt"
Write-Host "it's up - email"
sendMail -sendTo "my email" -emailBody "Ark Server is back up."
} elseif ($serverStatus -eq "3") {
Send-RCON "listplayers" > "D:\Ark Scripts\RCONlog.txt"
$log = Get-Content "D:\Ark Scripts\RCONlog.txt"
if ($log -eq "Authentication failed!") {
Write-Host "crashed and we know"
} else {
"1" > "D:\Ark Scripts\serverStatus.txt"
Write-Host "Back up"
}
} else {
#Checks RCON connection for crashes and sends crash email if connection fails.
Send-RCON "listplayers" > "D:\Ark Scripts\RCONlog.txt"
$log = Get-Content "D:\Ark Scripts\RCONlog.txt"
if ($log -eq "Authentication failed!") {
Write-Host "crashed"
"3" > "D:\Ark Scripts\serverStatus.txt"
sendMail -sendTo "my email" -emailBody "Ark Server has crashed."
return
} else {
"1" > "D:\Ark Scripts\serverStatus.txt"
Write-Host "it's up"
}
}
}
Exit-PSSession
我只想让这个while循环每10秒继续运行一次,以检查变量的状态以及是否找到exe并不断循环。这不起作用,脚本永远不会进入“服务器已启动,电子邮件永远不会发送”部分
你应该嵌套你的if语句,以便清楚地了解你在做什么这行不通,脚本永远不会进入“服务器启动,电子邮件永远不会”部分
您应该嵌套if语句,以清楚地了解您的操作“循环回到while循环的开头。”=继续
您需要被介绍到开关
Get Help about_switch
for it's short description“解释如何使用开关处理多个If语句。”@MathiasR.Jessen我尝试使用continue,但也不起作用。我将continue放在找到exe且服务器状态为0的部分中。它将该变量设置为1,然后向我发送电子邮件,但当它返回到顶部时,会返回到找到exe且服务器状态为0的部分,而当找到应转到exe且服务器状态为1的部分时。似乎不是再次检查参数,而是反复运行相同的代码块。您是否正在执行类似于$serverStatus=0
的操作来检查$serverStatus
的值是否为0
?那不行。如果您发布您正在使用的实际代码,这将更容易您可能正在更新serverstatus.txt
文件,但您从未实际更新$serverstatus
变量-如果它的值为0
,并且您重新启动循环,则该值仍然是0
,如果触发了块,则该值仍然是。您必须使用Get Content
更新变量,或直接与txt文件进行比较:${D:\Ark Scripts\serverStatus.txt}-eq 0
“循环回while循环的开头。”=继续
您需要引入开关
Get Help about_switch
for it's short description“解释如何使用开关处理多个If语句。”@MathiasR.Jessen我尝试使用continue,但也不起作用。我将continue放在找到exe且服务器状态为0的部分中。它将该变量设置为1,然后向我发送电子邮件,但当它返回到顶部时,会返回到找到exe且服务器状态为0的部分,而当找到应转到exe且服务器状态为1的部分时。似乎不是再次检查参数,而是反复运行相同的代码块。您是否正在执行类似于$serverStatus=0
的操作来检查$serverStatus
的值是否为0
?那不行。如果您发布您正在使用的实际代码,这将更容易您可能正在更新serverstatus.txt
文件,但您从未实际更新$serverstatus
变量-如果它的值为0
,并且您重新启动循环,则该值仍然是0
,如果触发了块,则该值仍然是。必须使用Get Content
更新变量,或直接与txt文件进行比较:${D:\Ark Scripts\serverStatus.txt}-eq 0
} elseif (((get-process $process -ea SilentlyContinue) -eq $Null) -And ($serverStatus -eq "0")) {
#Server is down and we are aware
Write-Host "it's down - we know"
} elseIf (((get-process $process -ea SilentlyContinue) -ne $Null) -And ($serverStatus -eq "0")) {
#Server is up and email