Autor Wątek:  Jak przytrzymać wykonywanie plików BAT na parę sekund?  (Przeczytany 32602 razy)

0 użytkowników i 1 Gość przegląda ten wątek.

Offline Ra

  • Zasłużony dla Symulatora
  • Wiadomości: 6343
  • Ostatni gasi światło...
    • Zobacz profil
    • Instalator+Starter+Edytor
  • Otrzymane polubienia: 374
Jak przytrzymać wykonywanie plików BAT na parę sekund?
« dnia: 03 Kwietnia 2008, 11:45:28 »
Robię automatycznie pobieranie nowej wersji mojego programu. Po pobraniu nowej wersji archiwum musi być rozpakowane i musi nadpisać plik MASZYNA.EXE. Aby móc nadpisać MASZYNA.EXE, trzeba zakończyć program. Nie chciało mi się wymyślać drugiego EXE do uruchomienia zmian (np. Gadu-Gadu ma swoje UPDATE.EXE). Wpadłem na niby prostszy pomysł - uruchomić plik BAT.

Niby wszystko jest świetnie, ale kłody pod nogi rzuca Microsoft. Obecnie dopracowałem się takiego pliku:
Kod: (INSTALL.BAT) [Zaznacz]
@ECHO OFF
C:\ProgsWin\7-Zip\7Z.EXE t download\m842.zip
IF ERRORLEVEL 1 GOTO error
C:\ProgsWin\7-Zip\7Z.EXE x download\m842.zip -aoa
:error
DEL download\m842.zip
IF EXIST %WINDIR%\COMMAND\START.EXE GOTO start
START MASZYNA.EXE
GOTO end
:start
%WINDIR%\COMMAND\START.EXE MASZYNA.EXE
:end
EXIT
Pokrótce opiszę, jak to działa. Pierwsza linia wyłącza wyświetlanie niepotrzebnych komunikatów. Następnie uruchamiany jest 7-Zip (ścieżka wzięta z rejestru Windows) do przetestowania pobranego archiwum. Jeśli archiwum jest poprawne, zostaje ono rozpakowane następnym wywołaniem 7-Zip. Jeśli jest błędne, nie zostanie rozpakowane (wykona się GOTO error). Kolejna linia usuwa pobrany plik, aby się niepotrzebnie nie plątał.

Dalej jest figura ekwilibrystyczna związana z niezgodnością wsteczną w Windows. W Windows 98 istnieje plik START.EXE do uruchamiania programów. W nowszych wersjach jest to wewnętrzne polecenie START. Gdyby pozostawić samo START, bez ścieżki, to na Windows 2000 uruchomi wskazany program, a na Windows 98 uruchomi się maszynowy START.EXE Pita. Jednak to nie jest już problem, udało mi się go rozwiązać, jak powyżej.

Problemem jest to, że 7-Zip uruchomiony za drugim razem, może się uruchomić na tyle szybko, że plik MASZYNA.EXE, który ma zostać nadpisany plikiem z archiwum, nie zostanie zwolniony. Wywołanie pliku BAT wstawiłem na sam koniec programu. Jeśli 7-Zip jest uruchamiany po raz pierwszy i wczytywany z dysku, na ogół zajmuje to wystarczająco dużo czasu. Ale jeśli był już używany i jest w pamięci, drugie wywołanie jest zbyt szybkie i nie wykonuje się prawidłowo.

Między wywołania 7-Zip dobrze by było wstawić jakieś opóźnienie. No i tutaj się kłania dziwna polityka firmy Microsoft. Mianowicie wstawiłem polecenie CHOICE /C:XZ /N /T:X,5 Wait, które bezproblemowo spełnia swoje zadanie w Windows 98. Natomiast Windows 2000 już nie ma tego polecenia. Znalazłem inne, nadające się do odczekania paru sekund (SLEEP, TIMEOUT). Problemem jest jednak to, że w Windows XP polecenia te są opcjonalne i nie są instalowane standardowo.

Pytanie moje jest - jak zmusić Windows wykonujące plik BAT do odczekania paru sekund tak, żeby to zadziałało niezależnie od wersji Windows? (Komenda PAUSE czeka na naciśnięcie klawisza, więc nie bardzo się nadaje.)

Na razie znalazłem ciekawe rozwiązanie z użyciem komendy PING.
« Ostatnia zmiana: 03 Kwietnia 2008, 12:54:13 wysłana przez Ra »
¯\_( ͡° ͜ʖ ͡°)_/¯ Ra

Polecam: kręgarz Wojciech Walczak, projekt masarni

Offline Mariusz1970

  • Zasłużony dla Symulatora
  • Wiadomości: 3932
    • Zobacz profil
  • Otrzymane polubienia: 288
Odp: Jak przytrzymać wykonywanie plików BAT na parę sekund?
« Odpowiedź #1 dnia: 03 Kwietnia 2008, 16:05:35 »
O ile nie znajdziesz lepszego rozwiązania, to wstaw jakieś swoje exe, które będzie służyło do tego, a poźniej możesz to exe skasować batem (choć chyba nie chcesz takiego rozwiązania), albo dołącz jakiś plik oryginalny microsoftu, abyś miał pewność, iż niezależnie jaki system, ów owe exe czy com będzie. U mnie choice.com jest w windows\command.
Dołączysz ten choice do tego katalogu, co ten bat. Później go za pomocą del w bat usuniesz.

Offline Ra

  • Zasłużony dla Symulatora
  • Wiadomości: 6343
  • Ostatni gasi światło...
    • Zobacz profil
    • Instalator+Starter+Edytor
  • Otrzymane polubienia: 374
Odp: Jak przytrzymać wykonywanie plików BAT na parę sekund?
« Odpowiedź #2 dnia: 03 Kwietnia 2008, 16:20:02 »
Na razie wstawiłem PING 127.0.0.1, które wykonuje się kilka sekund. (Trochę badziewne rozwiązanie, ale dostosowane do poziomu jakości Windows.) PING powinien być na każdym komputerze podłączonym do sieci, a pobieranie nowej wersji i tak wymaga sieci.

Wymyśliłem jeszcze, że można zapętlić drugie wywołanie 7-Zip aż do poprawnego wykonania. Na wszelki wypadek, można zrobić drugie wyjście z pętli sprawdzając parametr %1 w połączeniu z komendą SHIFT wraz z odpowiednią ilością parametrów startowych (np. dziesięć jedynek oddzielonych spacjami dla dziesięciu powtórzeń pętli).
¯\_( ͡° ͜ʖ ͡°)_/¯ Ra

Polecam: kręgarz Wojciech Walczak, projekt masarni

Offline ShaXbee

  • Administrator
  • Wiadomości: 1984
    • Zobacz profil
  • Otrzymane polubienia: 2
Odp: Jak przytrzymać wykonywanie plików BAT na parę sekund?
« Odpowiedź #3 dnia: 04 Kwietnia 2008, 22:22:43 »

Offline janek32

  • Wiadomości: 567
  • EMIT Ghp400M4C
    • Zobacz profil
  • Otrzymane polubienia: 1
Odp: Jak przytrzymać wykonywanie plików BAT na parę sekund?
« Odpowiedź #4 dnia: 05 Kwietnia 2008, 09:17:27 »
Jest taki programik, miniaturowy: http://www.computerhope.com/download/utility/sleep.exe

Użycie:
sleep 10Oznacza, że plik BAT będzie wstrzymany na 10 sekund.
W ogóle ten program jest dołączony (a przynajmniej powinien być) do systemu.
-Środa 844012.
-Zgłaszam się.
-Zapytaj energetykę, czy zapłacili rachunki, luzem ciągniemy i jest 2900.

Offline Ra

  • Zasłużony dla Symulatora
  • Wiadomości: 6343
  • Ostatni gasi światło...
    • Zobacz profil
    • Instalator+Starter+Edytor
  • Otrzymane polubienia: 374
Odp: Jak przytrzymać wykonywanie plików BAT na parę sekund?
« Odpowiedź #5 dnia: 05 Kwietnia 2008, 12:21:31 »
Właśnie problem w tym, że o ile może jest dołączony, to może nie być zainstalowany. A ja nie mam ochoty wymuszać na kimś, co ma sobie zainstalować. Poza tym 160kB to 1/3 wielkości mojego programu. Jak na parę sekund zatrzymania to trochę przesada. Jakbym miał dołączać oddzielne EXE, to od razu do całej instalacji. I złączył bym je z programem jako zasób - było by zapisywane do pliku tylko po pobieraniu nowszej wersji, a potem usuwane (żeby nikt nie doktoryzował się, do czego to służy).
¯\_( ͡° ͜ʖ ͡°)_/¯ Ra

Polecam: kręgarz Wojciech Walczak, projekt masarni

Offline Mariusz1970

  • Zasłużony dla Symulatora
  • Wiadomości: 3932
    • Zobacz profil
  • Otrzymane polubienia: 288
Odp: Jak przytrzymać wykonywanie plików BAT na parę sekund?
« Odpowiedź #6 dnia: 05 Kwietnia 2008, 14:32:45 »
Cytuj
Poza tym 160kB to 1/3 wielkości mojego programu. Jak na parę sekund zatrzymania to trochę przesada.

W sumie znalazłeś tego swojego pinga, ale rozumiem, dołączenie 160 kB zapełni userowi dysk.
W sumie jak na moje kulawe oko, to ma przede wszystkim działać. Jeśli chciałeś zatrzymania na parę sekund, to to exe jest jakimś rozwiązaniem.

Offline janek32

  • Wiadomości: 567
  • EMIT Ghp400M4C
    • Zobacz profil
  • Otrzymane polubienia: 1
Odp: Jak przytrzymać wykonywanie plików BAT na parę sekund?
« Odpowiedź #7 dnia: 06 Kwietnia 2008, 14:41:00 »
Właśnie problem w tym, że o ile może jest dołączony, to może nie być zainstalowany.
Tego się nie instaluje.
-Środa 844012.
-Zgłaszam się.
-Zapytaj energetykę, czy zapłacili rachunki, luzem ciągniemy i jest 2900.

Offline ShaXbee

  • Administrator
  • Wiadomości: 1984
    • Zobacz profil
  • Otrzymane polubienia: 2
Odp: Jak przytrzymać wykonywanie plików BAT na parę sekund?
« Odpowiedź #8 dnia: 06 Kwietnia 2008, 14:52:50 »
Odpowiedź zawierającą użycie sleep'a wysłałem zanim przeczytałem o użyciu ping'a, uważam że ping to rozsądniejsze rozwiązanie - 0 dodatkowych bajtów programu, a wywołanie będzie działać na wszystkich komputerach.

wait.bat:
@ping 127.0.0.1 -n %1% -w 1000> nul

Użycie:
@call wait 5
« Ostatnia zmiana: 06 Kwietnia 2008, 14:55:27 wysłana przez ShaXbee »

Offline Mariusz1970

  • Zasłużony dla Symulatora
  • Wiadomości: 3932
    • Zobacz profil
  • Otrzymane polubienia: 288
Odp: Jak przytrzymać wykonywanie plików BAT na parę sekund?
« Odpowiedź #9 dnia: 06 Kwietnia 2008, 15:37:23 »
Cytuj
0 dodatkowych bajtów programu

No nie całkiem, gdyż
Cytuj
wait.bat:
@ping 127.0.0.1 -n %1% -w 1000> nul
i
Cytuj
@call wait 5

zajmują 46+12 bajtów :) (około)

Wiem o co chodzi Ra, jest On poprostu perfekcjonistą, podziwiam - mówię to szczerze.