Skrypt .bat, który rozpoznaje wersję systemu

Czy zdarzyło Wam się kiedyś potrzebować skryptu, który  wykona się tylko na wskazanej wersji systemu Windows  albo  zachowa się nieco inaczej na Windows XP, a nieco inaczej na Windows 8? Myślę, że wielu z Was  tworząc na przykład automatyczną instalację jakiegoś programu, zetknęła się z takim wyzwaniem.

Dzisiaj pokażę jak w wierszu poleceń  i pliku wsadowym ( .bat) można podejrzeć wersję systemu Windows.

Windowsy informację o wersji chowają w wielu miejscach. W Wierszu poleceń można ją wyświetlić m.in. poleceniem „VER” oraz „SYSTEMINFO”.

„VER” zwróci nam nazwę systemu oraz numer wersji, ale w systemach nowszych niż XP i Server 2003 nie wyświetla już nazwy wersji  (Vista, 7, 8)

Tak więc, przykładowo dla anglojęzycznego Windows XP SP2 (32-bit) będzie to:

Microsoft Windows XP [Version 5.1.2600]

..dla anglojęzycznego Windows Server 2008 Standard z SP1 (32bit):

Microsoft Windows [Version 6.0.6001]

..a dla polskojęzyczny Windows 7 z SP1 (64bit) pokaże nam:

Microsoft Windows Wersja 6.1.7601]

To, że systemy od XP w górę nie pokazują już nazwy wersji może być kłopotliwe, gdyż na przykład Vindows Vista z SP2 oraz Windows Server 2008 z SP2 dzielą ten sam numer 6.0.6002.

Gdybyśmy jednak mieli rozróżniać tylko systemy XP i 2000 (…mimo, że Windows 2000 jest już wspierany przez Microsoft, to może macie takie antyki w swojej sieci…) to nasz plik wsadowy mógłby wyglądać następująco:

@echo off
VER | find „XP” > nul
IF %errorlevel% EQU 0 goto windows_xp
VER | find „2000” > nul
IF %errorlevel% EQU 0 goto windows_2000
ECHO To nie jest ani Windows XP, ani Windows 2000.
goto KONIEC:windows_xp
ECHO Wykryto Windows XP
goto KONIEC

:windows_2000
ECHO Wykryto Windows 2000
goto KONIEC

:KONIEC
ECHO Program zostanie zamkniety..
Timeout 5
exit

Znacznie lepiej (ale czasem niestety wolniej..) poradzi sobie polecenie „SYSTEMINFO”. Należy jednak nieco okiełznać ilość wyświetlanych informacji korzystając z dołączonej komendy:

| FIND „nazwa systemu”

( O tym sposobie filtrowania informacji pisałem w artykule o „Uptime”. )

@echo off
systeminfo | find ” Windows XP” > nul
IF %errorlevel% EQU 0 GOTO windows_xp
systeminfo | find ” Microsoft Windows 7″ > nul
IF %errorlevel% EQU 0 GOTO windows_7
systeminfo | find „Windows Server 2003” > nul
IF %errorlevel% EQU 0 GOTO windows_srv_2003
systeminfo | find „Windows Server 2008” > nul
IF %errorlevel% EQU 0 GOTO windows_srv_2008

ECHO Nie rozpoznano wersji systemu.
GOTO :KONIEC

:windows_xp
ECHO Wykryto Windows XP
goto KONIEC

:windows_7
ECHO Wykryto Windows 7
goto KONIEC

:windows_srv_2003
ECHO Wykryto Windows Server 2003
goto KONIEC

:windows_srv_2008
ECHO Wykryto Windows Server 2008
goto KONIEC

:KONIEC
echo Program zostanie zamkniety..
Timeout 5
pause
exit

Po przetestowaniu tego rozwiązania w niektórych przypadkach możecie niemile zaskoczyć się czasem działania (kilka(naście) sekund). Polecenie „systeminfo” zbiera i wyświetla naprawdę dużo informacji, a szczególnie topornie idzie mu zbieranie danych o zainstalowanych poprawkach bezpieczeństwa. To, co mogę zasugerować, to połączenie metody z „ver” i „systeminfo”. Jeśli macie sieć opartą na XP i Windows 7 to plik wsadowy może najpierw sprawdzić  za pomocą „ver”, czy dany system to XP, a dopiero potem sprawdzić czasochłonnym „systeminfo”, czy mamy do czynienia z Windows 7.

A Wy, jakie macie sposoby na rozpoznawanie wersji systemu w skrypcie?

Łukasz Skalikow

Obecnie Manager IT. Przez lata byłem Inżynierem systemów. Jestem entuzjastą i specem od vSphere, Windows serwer, GPO. Od zawsze byłem zwolennikiem wiersza poleceń i automatyzacji. Obecnie, ze względu na pracę, rodzinę i wyjazdy służbowe, dużo mniej udzielam się na blogu, ale mam nadzieję, że pośród kilkuset porad opublikowanych na spece.it, wiele osób znajdzie dla siebie coś przydatnego :)

Przeczytaj także...

8 komentarzy

  1. Adam pisze:

    A ja korzystam z dxdiag. Systeminfo nie działa na wszystkich wersjach Windows. Co prawda trzeba czekać jeszcze dłużej niż na systeminfo, ale przynajmniej jest to skuteczne. Problemem może też być angielska wersja interpretera cmd, np. w moim Windows8 okno wiersza poleceń jest po angielsku, więc i to trzeba uwzględnić.

    Skrypt wyszedł mi z tego dosyć zagmatwany, ale działa na każdym napotkanym Windows…

    @echo off
    cls
    :: —– sprawdzanie typu systemu Windows
    if exist dx.txt del dx.txt /q
    title Rozpoznawanie systemu.
    echo,
    echo Trwa rozpoznawanie typu systemu Windows…
    if exist dx.txt goto analiza_raportu_dx

    call dxdiag /whql:off /t dx.txt

    :czy_jest_raport_dx
    if not exist dx.txt PING -n 3 localhost >nul& goto czy_jest_raport_dx

    :analiza_raportu_dx

    for /F „tokens=3,4,5,6,7,8,9” %%a in (‚find „Operating” dx.txt’) do (set WinPar1=%%a& set WinPar2=%%b& set WinPar3=%%c& set WinPar4=%%d& set WinPar5=%%e& set WinPar6=%%f& set WinPar7=%%g)

    :: — sprawdzenie języka linii poleceń
    set Jezyk=PL

    ver | find /I „version” >nul
    if [%errorlevel%]==[0] set Jezyk=EN& goto jezyk_sprawdzony

    ver | find /I „wersja” >nul
    if [%errorlevel%]==[0] set Jezyk=PL
    :jezyk_sprawdzony

    if [„%WinPar1% %WinPar2:~0,6% %WinPar3% %WinPar4% %WinPar5% %WinPar6% %WinPar7%”]==[„Windows Server 2008 Standard (6.0, Build 6002)”] goto Win2008srv-64
    if [„%WinPar1% %WinPar2:~0,6% %WinPar3% %WinPar4% %WinPar5% %WinPar6%”]==[„Windows Server 2008 R2 Enterprise 64-bit”] goto Win2008srv-64
    if [„%WinPar1% %WinPar2:~0,6% %WinPar3% %WinPar4% %WinPar5% %WinPar6%”]==[„Windows Server 2008 R2 Foundation 64-bit”] goto Win2008srv-64
    if [„%WinPar1% %WinPar2:~0,5% %WinPar3%”]==[„Windows Vista Home”] goto WinV78Home
    if [„%WinPar1% %WinPar2:~0,5% %WinPar3%”]==[„Windows Vista Professional”] goto WinV78Pro
    if [„%WinPar1% %WinPar2% %WinPar3%”]==[„Windows 7 Home”] goto winV78home
    if [„%WinPar1% %WinPar2% %WinPar3%”]==[„Windows 7 Professional”] goto winV78pro
    if [„%WinPar1% %WinPar2% %WinPar3%”]==[„Windows 8 Home”] goto winV78home
    if [„%WinPar1% %WinPar2% %WinPar3%”]==[„Windows 8 Pro”] goto winV78pro
    if [„%WinPar1% %WinPar2% %WinPar3% %WinPar4%”]==[„Windows (5.2, Build 3790)”] goto Win2003srv-32
    if [„%WinPar1% %WinPar2%”]==[„Windows XP”] goto WinXp

    :: —- co jeśli to nowy rodzaj systemu
    :WinInny
    set win_nazwa=%WinPar1%
    if exist „%windir:~0,3%\Program files (x86)” set win_bit=64-bit& goto wyswietl_win
    set win_bit=32-bit& goto wyswietl_win

    :: —– system został rozpoznany (zgodny z jednym z wzorców)
    :winxp
    set win_nazwa=%WinPar1%
    set win_wersja=%WinPar2%
    if [%WinPar3:~0,3%]==[Pro] (set win_rodzaj=%WinPar3:~0,3%) else (set win_rodzaj=%WinPar3%)
    set win_bit=32-bit
    goto wyswietl_win

    :WinV78Home
    set win_nazwa=%WinPar1%
    set win_wersja=%WinPar2:~0,5%
    set win_rodzaj=%WinPar3%
    set win_bit=%WinPar5%
    goto wyswietl_win

    :WinV78Pro
    set win_nazwa=%WinPar1%
    set win_wersja=%WinPar2:~0,5%
    set win_rodzaj=%WinPar3:~0,3%
    set win_bit=%WinPar4%
    goto wyswietl_win

    :win2003srv-32
    set win_nazwa=%WinPar1%
    set win_wersja=2003
    set win_rodzaj=Server
    set win_bit=32-bit
    goto wyswietl_win

    :Win2008srv-64
    set win_nazwa=%WinPar1%
    set win_wersja=%WinPar3%
    set win_rodzaj=%WinPar2:~0,6%
    set win_bit=64-bit
    goto wyswietl_win

    :wyswietl_win
    echo – Rozpoznano system %win_nazwa% %win_wersja% %win_rodzaj% %win_bit%.
    pause

  2. Adam pisze:

    … po zamieszczeniu komentarza chciałem wypróbować własną poradę, ale kopiując skrypt z tej ramki dostajemy trochę śmieci, więc skrypt nie zadziała. Jeśli ktoś chciałby faktycznie z niego skorzystać, proszę o adres email, prześlę czysty skrypt. Ewentualnie proszę moderatora o poradę, jak wklejać tutaj skrypty „na czysto”.

  3. Therminus pisze:

    „FIND: format parametru jest niepoprawny”
    Gdzie leży błąd?

  4. Adam pisze:

    Wysłałem, ale dwa razy odrzuciło z powodu załącznika, mimo, że był spakowany. Trzeci raz posłałem ze zmienioną nazwą, już nie odrzuciło… doszło?

  5. emes2 pisze:

    Witaj. Czy mógłbyś również do mnie przesłać skrypcik? Mój mail: emes2(at)o2.pl

Dodaj komentarz