Loops 将if循环留在while循环中

Loops 将if循环留在while循环中,loops,powershell,Loops,Powershell,我正在编写一个PowerShell脚本,它不断检查我正在运行的游戏服务器的状态,并且根据某些exe和变量的状态,某些事情会发生。我构造这个的方式是,首先我有一个计时器启动,我有一个while循环,它一直运行到计时器达到280秒。在这个while循环中有一系列if-than-else语句,它们查看前面提到的所有变量和exe的状态,然后执行不同的操作。我想要的是,当它到达一个条件的末尾时(如果找不到exe,服务器状态为0),然后给我发送电子邮件,然后返回整个的开头,而循环并继续循环并检查服务器的状态

我正在编写一个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