Cum să așteptați pentru rețea într-un script batch la pornirea pe Windows Server? (Administrarea sistemului, Windows, Windows Server 2012, Boot, Azure)

robert4 a intrebat.
a intrebat.

Execut un fișier batch cu TaskScheduler „La pornirea sistemului „pe un Windows Server 2012 în Azure, și am observat că nu există rețea timp de 20-60 de secunde după pornirea batch-ului. în prezent am adăugat o așteptare constantă cu ping,și funcționează de cele mai multe ori, dar uneori nu. Îmi puteți sugera o metodă mai robustă de așteptare până când rețeaua este disponibilă? (pentru trimiterea de e-mail și/sau cereri http)

Comentarii

  • O posibilă soluție aici: superuser.com/questions/48231/… –  > Por Byron C..
  • Nu, acestea nu sunt relevante pentru această întrebare. Acele soluții așteaptă o perioadă fixă, asta fac eu deja. Aș dori să aștept până când rețeaua devine pregătită pentru solicitări http/smtp de la distanță, de preferință fără a cabla numele unei conexiuni de rețea în Windows. –  > Por robert4.
3 răspunsuri
Get-HomeByFiveOClock

Se pare că intenționați să folosiți lotul pentru acest lucru, așa că aici merge. Este posibil să doriți să rulați acest lucru de către băieții de la SO, deoarece ei sunt scripturi mai bune decât mine. De fapt, am luat logica principală de la (https://stackoverflow.com/questions/21245545/ping-test-using-bat-file-trouble-with-errorlevel)completă cu motivul pentru care testarea dacă un ping va trece prin această metodă este preferabilă altora.

@echo off

set IPaddress=%%1  REM add IP address as command line argument or just static

:TEST
ping -n 1 %IPaddress% | find "TTL=" >nul
if errorlevel 1 (
    goto RETRY
) else (
    goto DOSTUFF
)

:RETRY
ping 127.0.0.1 -n 11>nul REM waits given amount of time, set to 10 seconds
goto TEST

:DOSTUFF
do stuff REM Do stuff
exit

Practic, se face ping la intervale de o secundă și se verifică dacă se produce un ping reușit. În caz afirmativ, face ceea ce încercați să scrieți.

Nu am codificat în mod dur adresa IP pentru care doriți să verificați conectivitatea ICMP de bază, ci am adăugat-o ca argument în linia de comandă. Sau puteți să o codificați în mod direct.

Este posibil să doriți să verificați de două ori sintaxa, deoarece nu am testat deloc acest lucru.

EDIT: Am schimbat valoarea ping la 11 pentru a reflecta o întârziere reală de 10 secunde.

Comentarii

  • Singura eroare de sintaxă este că REM este de fapt o comandă, deci nu o puteți pune pe aceeași linie cu o altă comandă. Mutați comentariile pe linia de mai sus și acest script funcționează perfect. Vă mulțumim! –  > Por Wolfgang.
tombull89

Utilizați opțiunea „Start only if this network connection is available” (Porniți numai dacă această conexiune de rețea este disponibilă).

Comentarii

  • Am crezut că semnificația acestei casete de selectare este de a omite sarcina dacă rețeaua nu este disponibilă în momentul declanșării (adică la pornire) în loc să aștepte până când rețeaua devine disponibilă. O să încerc. –  > Por robert4.
  • Confirmat: acest lucru nu așteaptă ca rețeaua să devină disponibilă, în schimb omite sarcina dacă nu există rețea la pornire. –  > Por robert4.
Nitz

În conformitate cu acest răspuns pe superuser, , puteți să vă abonați sarcina programată la evenimentul „rețeaua este disponibilă”.
Atâta timp cât nu filtrezi pentru o anumită rețea, cred că ar trebui să funcționeze.

Comentarii

  • Bună idee, dar am nevoie să execut acest lot numai la pornirea sistemului. În scriptul de pornire ar trebui să verific prezența unui eveniment recent „rețeaua este disponibilă”… Este fezabil cu wevtutil.exe, , dar nu mai simplu decât monitorizarea rețelei cu cURL sau altele asemenea. –  > Por robert4.
  • Am folosit odată o soluție similară (task scheduler care așteaptă un eveniment de rețea), presupunând că serverele mele nu primesc multe evenimente de tip „network-is-up” după ce au fost pornite. –  > Por Nitz.