Skocz do zawartości
ziCk_lodz

Prosty skrypt otwierający link w przeglądarce

Rekomendowane odpowiedzi

Potrzebuję wyprodukować skrypt działający w tle który pingował by adres raz na kilka minut i w razie braku odpowiedzi otwierał link w przeglądarce i kontynuował pingowanie.

 

Jak to najprościej wykonać?

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Ja bym zrobił w powershellu, ping to jedna instrukcja, otarcie przeglądarki to druga. OK, sparsowanie wyników pinga to kilka dodatkowych. Taki skrypt można sobie odpalić w oknie w tle. Zrobienie z tego usługi windowsowej do chyba przesadna komplikacja, ale jak ma być co kilka minut, to można to wpiąć w harmonogram zadań (czy jak to się teraz nazywwa) i tez będzie dobrze.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Ok siłą google ulepiłem takiego Frankensteina z różnych źródeł:

 

$sites = "google.com","youtube.com","hexus.net"
$time = Get-Date -Format G


Foreach ($site in $sites) {

   $ping = Test-Connection -ComputerName $site -Count 4 -ErrorAction SilentlyContinue

   if ($ping) {
      Write-output "$time  [OK]  $site respond to pings" | Out-File 'H:\Liberty-izone\log.txt' -Append
       }Else{
   if (($ping) -ne $true) {
       Write-output "$time [ERROR] $site failed to respond. Attempting reconnect" | Out-File 'H:\Liberty-izone\log.txt' -Append
       $IE=new-object -com internetexplorer.application 
       $IE.navigate2("moj_adres_url") 
       $IE.visible=$false
       $IE.close
       }
   }   
}

Generalnie skrypt z grubsza robi to co chcę żeby robił (czyt. działa), ale nie do końca tak jak bym chciał - a nie mam zielonego pojęcia o skryptowaniu PowerShella (albo czegokolwiek innego...)

 

Problemy:

1) po failu pinga google.com nie próbuje pingować innych stron (albo próbuje, ale nie zapisuje wyniku w logach)

22/10/2019 21:21:53 [ERROR] google.com failed to respond. Attempting reconnect
22/10/2019 21:22:14  [OK]   google.com respond to pings

2) wydaje mi się (jak już wspomniałem, nie mam o tym pojęcia), że pierwszy fail pinga powoduje otworzenie linku w przeglądarce - czyt. jeżeli z 4 pingów jeden sfailuje to link jest otwierany. Chciałbym, żeby skrypt brał całość pod uwagę, a nie reagował przy pierwszym failu

3) $IE.close wypluwa error i nie zamyka procesu Internet Explorera. edit: podmieniłem na Stop-Process -Name "iexplore" -Force i hula.

4) Nie wiem jak do końca jak ustawić, żeby skrypt się odpalał co 5 minut + nie otwierał okna konsoli (wszystko powinno dziać się w tle, bez deaktywowania obecnie aktywnego okna)

Edytowane przez ziCk_lodz

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

koniecznie potrzebujesz tego ie? czy chcesz, żeby odpalił się skrypt php pod tym adresem?

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

koniecznie potrzebujesz tego ie? czy chcesz, żeby odpalił się skrypt php pod tym adresem?

A to tak się da? :E

 

 

edit:

zamiast

$IE.Close()

 

dodałem:

       Start-Sleep -Seconds 5
       Stop-Process -Name "iexplore" -Force 
       Stop-Process -Name "ielowutil" -Force

 

I ubija proces po 5 sekundach - best start-sleep proces był ubijany zanim przeglądarka była w stanie otworzyć adres :thumbup::E

Edytowane przez ziCk_lodz

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

4) Nie wiem jak do końca jak ustawić, żeby skrypt się odpalał co 5 minut + nie otwierał okna konsoli (wszystko powinno dziać się w tle, bez deaktywowania obecnie aktywnego okna)

Dodałem skrypt do Harmonogramu Zadań, żeby się potwarzał co 5 minut, ale po odpaleniu skrypt lata non-stop. Czyt. otwiera adres url w IE, ale już nie zamyka procesu ani nie zapisuje nic w logach - za to skrypt odpala się średnio co kilkanaście sekund. :hmm:

 

 

 

edit:

Idąc za sugestią @januzi i spróbowaniem wget, okazuje się, że PowerShell ma swój odpowiednik. Zastąpiłem całą zmienną $IE na Invoke-WebRequest i hula.

 

Invoke-WebRequest -UseBasicParsing mój_adres_url

 

Teraz tylko jak poprawnie ustawić pingowanie kilku stron i wykonanie akcji dopiero po braku odpowiedzi ze wszystkich, bo ten potworek którego wkleiłem wcześniej nie sprawdza nic poza pierwszym adresem.

Edytowane przez ziCk_lodz

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Dobra przepisałem to z nowo zdobytą wiedzą:

$time = Get-Date -Format G
$list = "google.com", "hotmail.com", "yahoo.com"
$ping = Test-Connection -ComputerName $list -Count 1 -BufferSize 6 -Quiet

   if (($ping -eq $True).Count -gt 0) {
       Write-output "$time [OK] Connection success" | Out-File 'C:\log\log.txt' -Append
   } else {
       Write-Output "$time [ERROR] failed to respond. Attempting to reconnect" | Out-File 'C:\log\log.txt' -Append
       Invoke-WebRequest -UseBasicParsing https://moj_adres_url
   }

 

Pinguje strony jedną po drugiej, daje output True albo False, sprawdza czy jest chociaż jedno True i jeżeli jest to nie robi nic (chyba :D), a jak nie ma żadnego True to wykonuje Invoke-WebRequest.

 

Nie mogę teraz zrobić, żeby skrypt się odpalał co 5 minut. Wrzuciłem w Harmonogram, ustawiłem czas, najwyższe przywileje, ale nic się nie dzieje. Skrypt działa, bo manualne odpalenie z Harmonogramu wykonuje go poprawnie. Jakieś sugestie? edit: nie wiem dlaczego skrypt się nie odpala od użytkownika z przywilejami administracyjnymi, ale po zmianie użytkownika na SYSTEM skrypt działa bez zażutu. :hmm:

Edytowane przez ziCk_lodz

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Trzeba by się wgłębić w działanie systemu. Kiedyś pod linuksem mieliśmy przypadek, ze program odpalany "z palca" działał bez problemu, a uruchamiany ze skryptu startowego systemu wywalał się. Problem tkwił w dostępie do konsoli, która z poziomu skryptów startowych jest inaczej obsługiwana, więc przeoczony wypis na ekran prowadził do błędu.

W Win może być podobnie, że skrypty uruchamiane z harmonogramu działają w inne powłoce niż użytkownika. Ale to są moje domysły, trzeba by pogrzebać w sieci.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Teraz mi powiedzcie jak to co zrobiłem zapętlić, żeby w razie braku połączenia powtarzało procedurę do skutku (poza harmonogramem) :E

Edytowane przez ziCk_lodz

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Na podstawie togo co masz ale z zaznaczeniem, ze powershella nie znam, więc będą błędy.

$time = Get-Date -Format G
$list = "google.com", "hotmail.com", "yahoo.com"
$ping = Test-Connection -ComputerName $list -Count 1 -BufferSize 6 -Quiet

   while(($ping -eq $False).Count -gt 0) { //<---------!!!! tutaj do poprawy, zmieniłem if na while i True na False
     {
       Write-Output "$time [ERROR] failed to respond. Attempting to reconnect" | Out-File 'C:\log\log.txt' -Append
       Invoke-WebRequest -UseBasicParsing https://moj_adres_url
       $ping = Test-Connection -ComputerName $list -Count 1 -BufferSize 6 -Quiet //<-------- ponowne wykonanie pinga
     }
Write-output "$time [OK] Connection success" | Out-File 'C:\log\log.txt' -Append

Pomysł polega na zamianie if-a na pelę while i sprawdzeniu przeciwnego warunku, czyli że nie udało się spingować. Wtedy robisz akcję jak do tej pory i na koniec pętli jeszcze raz puszczasz pinga.

Jeżeli ping się uda, to pętla jest przerywana i wykona się kod znajdujący się za nią.

 

Zapewne udałoby się upchnąć robienie pinga w warunek pętli ale nie wiem czy jest sens tak motać ;)

Edytowane przez Bono[UG]

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto

Jedynie zarejestrowani użytkownicy mogą komentować zawartość tej strony.

Zarejestruj nowe konto

Załóż nowe konto. To bardzo proste!

Zarejestruj się

Zaloguj się

Posiadasz już konto? Zaloguj się poniżej.

Zaloguj się

  • Ostatnio przeglądający   0 użytkowników

    Brak zarejestrowanych użytkowników przeglądających tę stronę.

×
×
  • Dodaj nową pozycję...