2016-11-09 4 views
0

Я пытаюсь написать небольшую утилиту, которая проверит подключение к некоторым серверам, и когда есть несколько секунд потери пакетов, чтобы сделать что-то еще.Продолжить скрипт назад к началу цикла while

Однако, как только это будет сделано, я хотел бы продолжить тестирование подключения и т. Д. Без выхода сценария. В первую очередь я делаю это как учебное упражнение для создания подобных стилей сценариев в будущем для некоторых ежедневных задач, которые мы делаем.

До сих пор я придумал несколько вариантов этого, однако, похоже, я не могу это понять. Пока что я создал функцию.

function ServerUp { 
    while (Test-Connection -Cn $Server -BufferSize 16 -Count 4 -ea 0) { 
     "Server is up" 
    } 
} 
} 

function ServerDown { 
    while (!(Test-Connection -Cn $Server -BufferSize 16 -Count 4 -ea 0)) { 
     "Connection to server went down" 
    } 
    { 
    } 
} 

$Server = Read-Host -Prompt 'Input your server name' 

ServerUp 
ServerDown 

Я играл с большим количеством различных вариаций этого (например, создание, если заявление после цикла while, чтобы сделать что-то, когда цикл while больше не верно и т.д.), но каждый раз, когда он кажется для выхода из сценария.

После выполнения некоторых исследований кажется, что продолжение может стать способом сделать это, но я не могу заставить его работать правильно.

Возможно ли это даже без какого-либо «goto» (которого я не понимаю в PowerShell).

+0

'for() {ServerUp; ServerDown} ' – PetSerAl

+0

Спасибо за информацию, это тоже сработало, но я закончил тем, что использовал информацию из сообщения ниже. – user7138090

ответ

1

Почему бы не объединить две проверки в одну функцию, а затем поместить ее внутри цикла?

function Test-ServerConnection { 
    if(Test-Connection -Cn $Server -BufferSize 16 -Count 4 -ea 0){ 
     "Server is up" 
    } else { 
     "Server is down" 
    } 
} 

while($true){ 
    Test-ServerConnection 
} 
+0

Извините за поздний ответ, но это был самый полезный ответ, спасибо! – user7138090

1

Возможно ли это даже без какой-либо «goto» (что, насколько я понимаю, отсутствует в powershell).

Это не в PowerShell, и это позор. Именно по этой причине - нет цикла, в котором четко сказано «цикл навсегда». Есть только способы зажать гайки в существующие петли, чтобы помешать им и держать их открытыми, чтобы они никогда не выходили.

while ($true) { 
    #code here 
} 


do { 
    # code here 
} while ($true) 


do { 
    # code here 
} until ($false) 


for() { 
    # code here 
} 

continue не полезно здесь - это для пропуска оставшейся части блока петли, и перейти к следующему пункту.

+0

Есть ли какой-либо язык с явной конструкцией для бесконечных циклов? AFAIK 'while (true)' - это то, что обычно используется, чтобы выразить это на большинстве языков. –

+0

@AnsgarWiechers [Wikipedia says] (https://en.wikipedia.org/wiki/Infinite_loop#Language_support) Ада, Фортран, Го и Руби - но только Ада и Руби имеют ясное намерение. [Rosettacode] (https://www.rosettacode.org/wiki/Loops/Infinite) говорит, что 4DOS Batch, AppleScript, AutoHotkey, Standard BASIC, Brat, CoffeeScript, Common Lisp, Haskell, Maple, Modula-2, Perl 6, PostScript , R, Rust, VB.Net - все имеют бесконечные синтаксисы циклов, которые не включают условие True. У некоторых есть синтаксис 'loop {}', который я представлял себе PS. (и любой язык с 'label start/goto start') – TessellatingHeckler

Смежные вопросы