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:@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.