Показать полную графическую версию : [решено] Определение версии (сборки) и сервис пака ОС
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 и висты ?
в 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 »
на выходе получается фигня какая-то
на выходе получается фигня какая-то »
проблема не в этой строке, а в реализации "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
это поиск в ?
ultra_fs, в разных осях REG.EXE выдает разное количество строк заголовка, вместо корректировки Skip можно отфильтровать выходной поток и оставить только одну нужную нам строку (содержащую текст "REG_SZ"), это и делает REG|FIND "REG_SZ"
заметил очень странный глюк с параметром CSDVersion . Если запускаю батник который пытается получить его значение в висте 64 из тотал командера то поучаю вот это в ответ "Ошибка: Не удается найти указанный раздел или параметр в реестре." А если запускаю тот же батник их проводника то все ок.
Хотелось бы как-то решить эту проблему.
mitiya, отключить в батнике "@Echo Off" и выполнить в таком виде:
Batnik.CMD >Batnik.LOG 2>&1
лог в студию
вот запущенный из тотала
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
на пробу еще два варианта:
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 без проблем
второго ключа нет , смотрел через regedit.
Первый то есть , но с ним все так же как и раньше.
При чем что интересно, если запускаю проводник из тотала (правой кнопка -> проводник) то все равно не находит, а если через пуск к примеру то находит.
я так понимаю Wow6432Node это ветка которую видят 32битные приложения ?
я так понимаю 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%"
в ветке HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows NT\CurrentVersion нет ключа CSDVersion
mitiya, как уже сказал, под рукой только Win2003 x64 - там есть, насчет Висты ничего не скажу :dont-know
судя по всему смысл этого глюка в том, что при запуске из тотала 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
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
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.