Войти

Показать полную графическую версию : [решено] Определение версии (сборки) и сервис пака ОС


Страниц : [1] 2 3 4

ultra_fs
27-05-2009, 02:10
Может кто-нибудь поделится скриптом который возвращает версию ОС и ее сервис пак в консоли , с последующим запуском файла в консоли или подсказать соответствие версии сборок ОС (Nt,2k,2k server,xp, 2k3, vista) сервис пакам для нижеприведенного скрипта.

for /F "tokens=4" %%V in ('ver') do if %%V==[Версия goto

Maza Faka
27-05-2009, 08:20
ultra_fs
Пример:

@Echo Off

For /F "Skip=4 Tokens=3" %%A In ('Reg Query "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion" /V CurrentVersion') Do Set OSver=%%A

For /F "Skip=4 Tokens=3" %%A In ('Reg Query "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion" /V CurrentBuildNumber') Do Set OSver=%OSver%.%%A


For /F "Skip=4 Tokens=3,*" %%A In ('Reg Query "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion" /V CSDVersion') Do Set SPver=%%A %%B

Echo %OSver%
Echo %SPver%

ultra_fs
29-05-2009, 01:29
Остановился на ниже приведенном коде скрипта, который определяет версию ОС, но универсальности не получилось, потому как в NT 4.0 отсутствует параметр в реестре "ProductName", а на в Viste вообще непонятное происходит


For /F "tokens=4" %%V in ('ver') do if %%V==4.0 goto ntdetect
rem пришлось определять версию nt 4 через ver ввиду отсутствия в реестре параметра "ProductName"

For /F "Skip=4 Tokens=3,*" %%A In ('Reg Query "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion" /V ProductName') Do Set OS1=%%A %%B
rem объявляем переменную os1 и присваиваем ей значение параметра "ProductName"

For /F "Tokens=1-3,*" %%C In ('Echo %OS1%') do if %%C==Microsoft if %%D==Windows if %%E==2000 start 2k.cmd
rem выполняем анализ переменной, если ее значение Microsoft Windows 2000 - запускаем 2k.cmd
For /F "Tokens=1-3,*" %%C In ('Echo %OS1%') do if %%C==Microsoft if %%D==Windows if %%E==XP start xp.cmd
rem выполняем анализ переменной, если ее значение Microsoft Windows XP - запускаем xp.cmd
For /F "Tokens=1-4,*" %%C In ('Echo %OS1%') do if %%C==Microsoft if %%D==Windows if %%E==Server if %%F==2003 start 2k3.cmd
rem выполняем анализ переменной, если ее значение Microsoft Windows Server 2003 - запускаем 2k3.cmd

For /F "Tokens=1-2,*" %%C In ('Echo %OS1%') do if %%C==Windows if %%D==Vista start vista.cmd
rem выполняем анализ переменной, если ее значение Windows Vista - должен запускаться vista.cmd
rem но на практике в висте скрипт не выполняется - появляется сообщение о выключенном echo
rem и неожиданном появлении Home



От скрипта требуется что бы при запуске в любой ос - он безошибочно определял ее и запускал соответствующий ей файл, а также хотелось чтобы он был максимально универсален. Есть какие-нибудь идеи насчет nt и висты ?

amel27
30-05-2009, 10:27
в NT 4.0 отсутствует параметр в реестре "ProductName" »
зато присутствуют CurrentVersion, CurrentBuildNumber и CSDVersion - более чем достаточно
FYI: http://en.wikipedia.org/wiki/Microsoft_Windows

на в Viste вообще непонятное происходит »
FYI: http://capitalhead.com/articles/how-to-find-build-and-revision-number-of-windows-vista-or-windows-server-2008-installed.aspx

ultra_fs
31-05-2009, 23:55
FYI: http://capitalhead.com/articles/how-...installed.aspx »
это-то понятно , визуально ключи и параметры соответсвуют, тем же ключам xp или 2k3, но при том же запросе в viste
For /F "Tokens=1-2,*" %%C In ('Echo %OS1%') do if %%C==Windows if %%D==Vista start vista.cmd »
на выходе получается фигня какая-то

amel27
01-06-2009, 04:36
на выходе получается фигня какая-то »
проблема не в этой строке, а в реализации "Reg Query", попробуйте так:
@Echo Off

For /F "Tokens=2* Delims= " %%A In ('Reg Query "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion" /V ProductName^|Find "REG_SZ"') Do Set OS1=%%B
@Echo %OS1%

ultra_fs
01-06-2009, 19:57
amel27, спасибо большое, все заработало, а можно для понимания пояснить вот эту вот конструкцию
ProductName^|Find "REG_SZ
это поиск в ?

amel27
02-06-2009, 04:29
ultra_fs, в разных осях REG.EXE выдает разное количество строк заголовка, вместо корректировки Skip можно отфильтровать выходной поток и оставить только одну нужную нам строку (содержащую текст "REG_SZ"), это и делает REG|FIND "REG_SZ"

mitiya
21-06-2009, 22:57
заметил очень странный глюк с параметром CSDVersion . Если запускаю батник который пытается получить его значение в висте 64 из тотал командера то поучаю вот это в ответ "Ошибка: Не удается найти указанный раздел или параметр в реестре." А если запускаю тот же батник их проводника то все ок.

Хотелось бы как-то решить эту проблему.

amel27
22-06-2009, 04:37
mitiya, отключить в батнике "@Echo Off" и выполнить в таком виде:
Batnik.CMD >Batnik.LOG 2>&1
лог в студию

mitiya
22-06-2009, 09:33
вот запущенный из тотала



D:\temp>Reg Query "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion" /V CSDVersion


Ошибка: Не удается найти указанный раздел или параметр в реестре.



вот тот же из проводника




D:\temp>Reg Query "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion" /V CSDVersion

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion
CSDVersion REG_SZ Service Pack 1



весь батник состоит из одной строки


Reg Query "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion" /V CSDVersion

amel27
22-06-2009, 10:31
на пробу еще два варианта:
Reg Query "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion" /V CSDVersion
Reg Query "HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows NT\CurrentVersion" /V CSDVersion


З.Ы. на Win2003 x64 без проблем

mitiya
22-06-2009, 11:08
второго ключа нет , смотрел через regedit.

Первый то есть , но с ним все так же как и раньше.

При чем что интересно, если запускаю проводник из тотала (правой кнопка -> проводник) то все равно не находит, а если через пуск к примеру то находит.

я так понимаю Wow6432Node это ветка которую видят 32битные приложения ?

amel27
22-06-2009, 11:36
я так понимаю Wow6432Node это ветка которую видят 32битные приложения ? »угу, а ветка есть, а вот если по сетке с 32-битной подключиться - нету... поэтому можно еще так:
@Echo Off

If /I "%Processor_Architecture%"=="x86" Set $KEY=HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion
If /I "%Processor_Architecture%"=="x64" Set $KEY=HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows NT\CurrentVersion

Set $VAL=CSDVersion
Reg Query "%$KEY%" /v "%$VAL%"

mitiya
22-06-2009, 22:10
в ветке HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows NT\CurrentVersion нет ключа CSDVersion

amel27
23-06-2009, 04:41
mitiya, как уже сказал, под рукой только Win2003 x64 - там есть, насчет Висты ничего не скажу :dont-know

mitiya
23-06-2009, 10:51
судя по всему смысл этого глюка в том, что при запуске из тотала cmd как бы наследует "32х битность"
как бы сделать так чтобы она ее не наследовала ?

Devils0411
03-08-2009, 17:39
Проблема:
set disk=D:\NETBOOT
set XPNA=%disk%\XPNA
set XPNAD=%disk%\XPNAD
set XPA=%disk%\XPA
set XPAD=%disk%\XPAD
FOR /F "tokens=3* delims= " %%i in ('ver') do set version=%%i
If version==5.1 (
goto :XP) else (
goto :next1)
:XP
fsutil hardlink create "%XPNAD%\BOOTFONT.BIN" "%XPNA%\BOOTFONT.BIN"
fsutil hardlink create "%XPA%\BOOTFONT.BIN" "%XPNA%\BOOTFONT.BIN"
fsutil hardlink create "%XPAD%\BOOTFONT.BIN" "%XPNA%\BOOTFONT.BIN"
fsutil hardlink create "%XPNAD%\ntdetect.com" "%XPNA%\ntdetect.com"
fsutil hardlink create "%XPA%\ntdetect.com" "%XPNA%\ntdetect.com"
fsutil hardlink create "%XPAD%\ntdetect.com" "%XPNA%\ntdetect.com"
fsutil hardlink create "%XPNAD%\WIN51" "%XPNA%\WIN51"
fsutil hardlink create "%XPA%\WIN51" "%XPNA%\WIN51"
fsutil hardlink create "%XPAD%\WIN51" "%XPNA%\WIN51"
fsutil hardlink create "%XPNAD%\WIN51IP" "%XPNA%\WIN51IP"
fsutil hardlink create "%XPA%\WIN51IP" "%XPNA%\WIN51IP"
fsutil hardlink create "%XPAD%\WIN51IP" "%XPNA%\WIN51IP"
fsutil hardlink create "%XPNAD%\WIN51IP.SP3" "%XPNA%\WIN51IP.SP3"
fsutil hardlink create "%XPA%\WIN51IP.SP3" "%XPNA%\WIN51IP.SP3"
fsutil hardlink create "%XPAD%\WIN51IP.SP3" "%XPNA%\WIN51IP.SP3"
junction.exe -q -s "%XPNAD%\I386" "%XPNA%\I386"
junction.exe -q -s "%XPA%\I386" "%XPNA%\I386"
junction.exe -q -s "%XPAD%\I386" "%XPNA%\I386"
junction.exe -q -s "%XPAD%\$OEM$" "%XPNAD%\$OEM$"
goto :continue
:next1
If version==5.2 (
goto :2003) else (
goto :next2)
:2003
fsutil hardlink create "%XPNAD%\BOOTFONT.BIN" "%XPNA%\BOOTFONT.BIN"
fsutil hardlink create "%XPA%\BOOTFONT.BIN" "%XPNA%\BOOTFONT.BIN"
fsutil hardlink create "%XPAD%\BOOTFONT.BIN" "%XPNA%\BOOTFONT.BIN"
fsutil hardlink create "%XPNAD%\ntdetect.com" "%XPNA%\ntdetect.com"
fsutil hardlink create "%XPA%\ntdetect.com" "%XPNA%\ntdetect.com"
fsutil hardlink create "%XPAD%\ntdetect.com" "%XPNA%\ntdetect.com"
fsutil hardlink create "%XPNAD%\WIN51" "%XPNA%\WIN51"
fsutil hardlink create "%XPA%\WIN51" "%XPNA%\WIN51"
fsutil hardlink create "%XPAD%\WIN51" "%XPNA%\WIN51"
fsutil hardlink create "%XPNAD%\WIN51IP" "%XPNA%\WIN51IP"
fsutil hardlink create "%XPA%\WIN51IP" "%XPNA%\WIN51IP"
fsutil hardlink create "%XPAD%\WIN51IP" "%XPNA%\WIN51IP"
fsutil hardlink create "%XPNAD%\WIN51IP.SP3" "%XPNA%\WIN51IP.SP3"
fsutil hardlink create "%XPA%\WIN51IP.SP3" "%XPNA%\WIN51IP.SP3"
fsutil hardlink create "%XPAD%\WIN51IP.SP3" "%XPNA%\WIN51IP.SP3"
junction.exe -q -s "%XPNAD%\I386" "%XPNA%\I386"
junction.exe -q -s "%XPA%\I386" "%XPNA%\I386"
junction.exe -q -s "%XPAD%\I386" "%XPNA%\I386"
junction.exe -q -s "%XPAD%\$OEM$" "%XPNAD%\$OEM$"
goto :continue
:next2
If version==6.0 (
goto :Vista) else (
goto :Seven)
:Vista
mklink /H "%XPNAD%\BOOTFONT.BIN" "%XPNA%\BOOTFONT.BIN"
mklink /H "%XPA%\BOOTFONT.BIN" "%XPNA%\BOOTFONT.BIN"
mklink /H "%XPAD%\BOOTFONT.BIN" "%XPNA%\BOOTFONT.BIN"
mklink /H "%XPNAD%\ntdetect.com" "%XPNA%\ntdetect.com"
mklink /H "%XPA%\ntdetect.com" "%XPNA%\ntdetect.com"
mklink /H "%XPAD%\ntdetect.com" "%XPNA%\ntdetect.com"
mklink /H "%XPNAD%\WIN51" "%XPNA%\WIN51"
mklink /H "%XPA%\WIN51" "%XPNA%\WIN51"
mklink /H "%XPAD%\WIN51" "%XPNA%\WIN51"
mklink /H "%XPNAD%\WIN51IP" "%XPNA%\WIN51IP"
mklink /H "%XPA%\WIN51IP" "%XPNA%\WIN51IP"
mklink /H "%XPAD%\WIN51IP" "%XPNA%\WIN51IP"
mklink /H "%XPNAD%\WIN51IP.SP3" "%XPNA%\WIN51IP.SP3"
mklink /H "%XPA%\WIN51IP.SP3" "%XPNA%\WIN51IP.SP3"
mklink /H "%XPAD%\WIN51IP.SP3" "%XPNA%\WIN51IP.SP3"
junction.exe -q -s "%XPNAD%\I386" "%XPNA%\I386"
junction.exe -q -s "%XPA%\I386" "%XPNA%\I386"
junction.exe -q -s "%XPAD%\I386" "%XPNA%\I386"
junction.exe -q -s "%XPAD%\$OEM$" "%XPNAD%\$OEM$"
goto :continue
:Seven
mklink /H "%XPNAD%\BOOTFONT.BIN" "%XPNA%\BOOTFONT.BIN"
mklink /H "%XPA%\BOOTFONT.BIN" "%XPNA%\BOOTFONT.BIN"
mklink /H "%XPAD%\BOOTFONT.BIN" "%XPNA%\BOOTFONT.BIN"
mklink /H "%XPNAD%\ntdetect.com" "%XPNA%\ntdetect.com"
mklink /H "%XPA%\ntdetect.com" "%XPNA%\ntdetect.com"
mklink /H "%XPAD%\ntdetect.com" "%XPNA%\ntdetect.com"
mklink /H "%XPNAD%\WIN51" "%XPNA%\WIN51"
mklink /H "%XPA%\WIN51" "%XPNA%\WIN51"
mklink /H "%XPAD%\WIN51" "%XPNA%\WIN51"
mklink /H "%XPNAD%\WIN51IP" "%XPNA%\WIN51IP"
mklink /H "%XPA%\WIN51IP" "%XPNA%\WIN51IP"
mklink /H "%XPAD%\WIN51IP" "%XPNA%\WIN51IP"
mklink /H "%XPNAD%\WIN51IP.SP3" "%XPNA%\WIN51IP.SP3"
mklink /H "%XPA%\WIN51IP.SP3" "%XPNA%\WIN51IP.SP3"
mklink /H "%XPAD%\WIN51IP.SP3" "%XPNA%\WIN51IP.SP3"
junction.exe -q -s "%XPNAD%\I386" "%XPNA%\I386"
junction.exe -q -s "%XPA%\I386" "%XPNA%\I386"
junction.exe -q -s "%XPAD%\I386" "%XPNA%\I386"
junction.exe -q -s "%XPAD%\$OEM$" "%XPNAD%\$OEM$"
:continue
При запуске на 2003 не правильно срабатывает. Почему то сразу перескакивает толи к :vista толи к :seven

amel27
04-08-2009, 03:31
Devils0411, неправильно задается/читается переменная version, примерный шаблон:
Echo Off

For /F "Tokens=2 Delims=[]" %%i In ('ver') Do (
For /F "Tokens=2,3 Delims=. " %%a In ("%%i") Do Set version=%%a.%%b
)

If "%version%"=="5.1" GoTo XP
If "%version%"=="5.2" GoTo W2003
If "%version%"=="6.0" GoTo Vista

:Seven
Echo Windows 7
GoTo Continue

:XP
Echo Windows XP
GoTo Continue

:W2003
Echo Windows 2003
GoTo Continue

:Vista
Echo Windows Vista
GoTo Continue

:Continue

Devils0411
04-08-2009, 11:37
amel27, Странно... Когда делал вот такой тестовый вариант, то на семерке правильно срабатывал скрипт:
set disk=D:\test

FOR /F "tokens=3* delims= " %%i in ('ver') do set version=%%i
If version==5.1 (
goto :XP) else (
goto :next1)
:XP
del /S /Q xp.txt
goto :continue
:next1
If version==6.0 (
goto :vista) else (
goto :seven)
:Vista
del /S /Q vista.txt
goto :continue
:Seven
del /S /Q seven.txt
:continue
Если не трудно объясни.




© OSzone.net 2001-2012