不知道我哪里出错了我想跳过在线重新上线的计算机,但它会不断检查在线和在线计算机。
第一次更新很好,它即将上线,它应该跳过,只能ping离线的一个输出屏幕
g-10 Is coming online...Skipping to offline one's
192.168.0.1 Is coming online...Skipping to offline one's
Testing to see if Hero is coming online...
Hero is Offline. Pausing for 2 seconds. Remaining attempts: 1
Testing to see if zero is coming online...
zero is Offline. Pausing for 2 seconds. Remaining attempts: 1
这里很好,但在线电脑再次重复......
g-10 Is coming online...Skipping to offline one's
192.168.0.1 Is coming online...Skipping to offline one's
Testing to see if Hero is coming online...
Hero is Offline.
这是我的代码
$Comps = GC c:\restarted.txt
[int]$SleepTimer = "1" #minutes to attempt after
[int]$SleepSeconds = $SleepTimer * 2
[int]$Attempts = "2"
[int]$AttemptsCounter = 0
Do
{
$AttemptsCounter++
$RemainingAttempts = ([int]$Attempts - [int]$AttemptsCounter)
Foreach($comp in $comps){
$Online = Test-Connection -ComputerName $Comp -Quiet
IF($online -eq "True"){
Write-Host "$comp" -BackgroundColor Green -NoNewline
Write-Host " Is coming online...Skipping to offline one's"
}
elseIf ($Online -NE "True")
{
Write-Host "Testing to see if $Comp is coming online..."
Write-Host "$comp" -BackgroundColor Red -NoNewline
Write-Host " is Offline" -BackgroundColor Red -ForegroundColor Black -NoNewline
If ($AttemptsCounter -eq $Attempts) {
Write-Host "."
}
Else {
Write-Host ". Pausing for $SleepSeconds seconds. Remaining attempts: $RemainingAttempts"
}
}
}
#Check the number of attempts, break out if reached.
If ($AttemptsCounter -eq $Attempts) {break}
#Delay
Start-Sleep -s ($SleepTimer * 60)
}
While ($Online -NE "True")
If ($Online -NE "True") {
Write-Host "Maximum number of attempts reached"
}
Else {
Write-Host
Write-Host "Computer $Comp is " -NoNewline
Write-Host "ONLINE" -BackgroundColor Green
}
答案 0 :(得分:0)
Test-Connection
返回一个对象数组或$ null,具体取决于ip或hostname是否为活动。
所以如果你这样做就足够了:
IF($online){
// if its alive
}
else
{
// if its not responding
}
另一件需要指出的是你没必要
if(condition) {
}
elseif(condition) {
}
如果您正在测试“bool问题 - 答案”,则不需要elseif
。在您的情况下,如果您正在检查计算机的状态,那么您的答案不能超过2(是/否)。因此elseif
在这种情况下是多余的。
if(condition) {
// if the condition is true
}
else {
// if the condition is not true. you can't have the third option
}
此外,if条件If ($Online -NE "True")
正在检查变量$Online
是否与精确字符串“true”或“True”不相等,因为-ne
是不区分大小写的条件运算符。
您应该检查变量是否包含任何内容或保留$Null
答案 1 :(得分:0)
尝试以下代码。
它基本上为 <?php
if (isset($_POST['submit'])){
$timeout=$_POST['time_out'];
$timeout = date('Y-m-d H:i:s', strtotime(str_replace('-', '/', $timeout)));
mysqli_query($dbcon,"insert into user_logs_tbl (time_out) values('$timeout')")or die(mysqli_error($dbcon));
}
?>
中的每一行执行以下操作:
c:\restarted.txt
)-Count 1
:打印一些绿色文字和online
break
:打印红色文本,等待并递减$ RemainingAttempts变量并重做,直到offline
为$RemainingAttempts
或计算机为0
online
变量$RemainingAttempts
打印出更多文字
0
希望这有帮助!
如果您对该代码有任何疑问,请与我们联系。
KR 京特
答案 2 :(得分:0)
虽然我知道Guenther Schmitz已经进行了绿色检查,但我想跟进一些额外的细节和指示。
带有Test-Connection
开关的 -Quiet
会返回[Boolean]
类型。这是一个简单的真/假。我喜欢将字符串值与布尔值进行比较时要格外小心,因为根据测试框架的不同,可能会得到一些奇怪的结果。例如:
'false' -eq $true
$true -eq 'false'
Top 1等于false,bottom 1等于true,因为PowerShell正在将第二个对象转换为与第一个对象相同的类型,而非空字符串为true。所以我的强烈的建议是坚持打字比较。所以我开始的第一个代码更改是:
if ($Online -eq $true) {
正如@pandemic已经提到的那样,您进行了简单的比较,因此不需要elseif
,只需else
。
您遇到的第二个问题是,没有任何内容可以从测试列表中删除计算机。编写代码的方式,如果测试列表中的最后一台计算机是&#34; down&#34;然后它再次通过所有计算机。如果列表中的最后一台计算机是&#34; up&#34;然后它退出do|while
循环,无论您正在测试多少台计算机以及有多少台计算机出现故障。您可以通过在测试文件中放置1个已知主机和1个假主机的简单测试来验证这一点。如果已知的好主机是第一个,它将继续循环,直到$AttemptsCounter
达到允许的最大值。如果你翻转列表,它会在测试已知的好主机后立即拯救。
您的初始代码在所有计算机上循环,然后返回并重新启动。在Guenther的例子中,他们一次循环一台计算机,并检查直到它出现,或超过测试计数后纾困。我认为Guenther的例子可能就是你所追求的,但是如果你想让它循环通过所有的计算机,然后只测试那些失败的那些,我就写下这样的东西:
$comps = Get-Content -path 'c:\restarted.txt'
[int]$SleepTimer = 1
[int]$Attempts = 2
[int]$AttemptsCounter = 0
do {
Write-Host "Testing Network, attempt $($AttemptsCount + 1)"
$newComps = @()
foreach($comp in $comps) {
$online = Test-Connection -Quiet -Count 1 -ComputerName $comp
if ($online) {
Write-Host "$comp" -BackgroundColor Green -NoNewline
Write-Host " Is coming online...Skipping to offline one's"
} else {
$newComps += $comp
Write-Host "$comp" -BackgroundColor Red -NoNewline
Write-Host " is Offline" -BackgroundColor Red -ForegroundColor Black
}
}
$comps = $newComps
$AttemptsCounter++
Start-Sleep -Seconds ($SleepTimer * 60)
}
while (($comps.count -gt 0) -and ($AttemptsCounter -lt $Attempts))
if ($comps.Count -gt 0) {
Write-Host "Exceeded Attempts Counter" -BackgroundColor Red
}
在此代码中,它将获取计算机列表,当它在计算机上失败时,它会将其填充到临时列表中以供重用。