Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] Определение версии (сборки) и сервис пака ОС (http://forum.oszone.net/showthread.php?t=141160)

ultra_fs 27-05-2009 02:10 1128418

[решено] Определение версии (сборки) и сервис пака ОС
 
Может кто-нибудь поделится скриптом который возвращает версию ОС и ее сервис пак в консоли , с последующим запуском файла в консоли или подсказать соответствие версии сборок ОС (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 1128476

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 1129945

Остановился на ниже приведенном коде скрипта, который определяет версию ОС, но универсальности не получилось, потому как в 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 1130801

Цитата:

Цитата ultra_fs
в NT 4.0 отсутствует параметр в реестре "ProductName" »

зато присутствуют CurrentVersion, CurrentBuildNumber и CSDVersion - более чем достаточно
FYI: http://en.wikipedia.org/wiki/Microsoft_Windows

Цитата:

Цитата ultra_fs
на в Viste вообще непонятное происходит »

FYI: http://capitalhead.com/articles/how-...installed.aspx

ultra_fs 31-05-2009 23:55 1131897

Цитата:

Цитата amel27

это-то понятно , визуально ключи и параметры соответсвуют, тем же ключам xp или 2k3, но при том же запросе в viste
Цитата:

Цитата ultra_fs
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 1132000

Цитата:

Цитата ultra_fs
на выходе получается фигня какая-то »

проблема не в этой строке, а в реализации "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 1132495

amel27, спасибо большое, все заработало, а можно для понимания пояснить вот эту вот конструкцию
Цитата:

ProductName^|Find "REG_SZ
это поиск в ?

amel27 02-06-2009 04:29 1132734

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

mitiya 21-06-2009 22:57 1148475

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

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

amel27 22-06-2009 04:37 1148656

mitiya, отключить в батнике "@Echo Off" и выполнить в таком виде:
Код:

Batnik.CMD >Batnik.LOG 2>&1
лог в студию

mitiya 22-06-2009 09:33 1148727

вот запущенный из тотала

Код:


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 1148763

на пробу еще два варианта:
Код:

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 1148782

второго ключа нет , смотрел через regedit.

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

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

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

amel27 22-06-2009 11:36 1148809

Цитата:

Цитата mitiya
я так понимаю 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 1149333

в ветке HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows NT\CurrentVersion нет ключа CSDVersion

amel27 23-06-2009 04:41 1149450

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

mitiya 23-06-2009 10:51 1149604

судя по всему смысл этого глюка в том, что при запуске из тотала cmd как бы наследует "32х битность"
как бы сделать так чтобы она ее не наследовала ?

Devils0411 03-08-2009 17:39 1184536

Проблема:
Код:

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 1184887

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 1185075

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

Если не трудно объясни.

amel27 04-08-2009 12:08 1185113

Цитата:

Цитата Devils0411
Если не трудно объясни»

1. Позиция версии в VER непостоянна, например:
Код:

Win2003: "Microsoft Windows [Version 5.2.3790]"  (3-я)
WinXP  : "Microsoft Windows XP [Версия 5.1.2600]" (4-я)

2. Возвращаемый номер версии 3-х и более значный, номер сборки нужно отсекать.

3. При подстановке значения, имя переменной нужно брать в знаки '%'.

Цитата:

Цитата Devils0411
на семерке правильно срабатывал скрипт»

скрипт всегда будет падать на семерку, т.к. не выполняется ни одно из условий

Devils0411 04-08-2009 15:39 1185350

Спасибо, теперь стало яснее ;)

ultra_fs 03-09-2009 23:22 1210907

а как будет выглядеть параметр csdversion в случае отсутствия sp в системе (ну и условие скрипта для проверки соответственно)?

cleric1985_n 09-03-2010 12:35 1364203

Проверка версии операционной системы
 
Не знаю, задавался ли подобный вопрос, но я не нашел...или просто не уверен какие ключевые слова задать для поиска..
Интересует как с помощью батника или другим образом проверить версию системы, т.е. что взять в качестве проверяемого файла или параметра реестра..
Нужно для таких целей: есть программа которая работает на XP, но не работает на 7, или наоборот..так вот батник должен проверить какая система.. и только в том случае установить прогу, если подходит система...

amel27 09-03-2010 12:42 1364214

Цитата:

Цитата cleric1985_n
не уверен какие ключевые слова задать для поиска »

например, "CSDVersion" ;)

El Sanchez 09-03-2010 13:41 1364267

cleric1985_n,

Для XP:
Код:

@echo off
ver|find "XP"&&start "" "Path to proga\proga.exe"

Что выдает команда ver в win7 и есть ли она там вообще я не знаю. :blush2:

cleric1985_n 09-03-2010 18:49 1364574

Цитата:

Цитата amel27
например, "CSDVersion" »

Укажите плиз тогда как реализовать? Какие значения там должны быть?

Цитата:

Цитата El Sanchez
@echo off
ver|find "XP"&&start "" "Path to proga\proga.exe" »

Спасибо. В 7 проверил тоже работает, но там не указывается что это 7, но указана версия, т.е для 7 - 6.1, а XP - 5.1.
Могу я использовать эти данные в качестве маркерных?

seriych 09-03-2010 20:49 1364687

Цитата:

Цитата cleric1985_n
Могу я использовать эти данные в качестве маркерных? »

95: "95"
98: "98"
Me: "Me"
2000: "5.0"
XP: "5.1"
2003 или xp64: "5.2"
Vista: "6.0"
7: "6.1" или "7.0"

7ka 24-03-2010 06:47 1375799

El Sanchez
:unsure: извиняюсь если глупость спросил, но все-же:
к примеру у меня в папке есть два файла один только для хр другой для 7, программа выполняется из runonceex какую команду мне использовать если я ставлю на хр, чтобы запускалась программа для хр, а если я буду устанавливать на 7 то запускался файл для 7, а программа для хр игнорировалась
просто сдесь мне не совсем понятно:
Код:

@echo off
ver|find "XP"&&start "" "Path to proga\proga.exe"


Vadikan 24-03-2010 10:13 1375883

Цитата:

Цитата cleric1985_n
но там не указывается что это 7, но указана версия, т.е для 7 - 6.1, а XP - 5.1. »

Operating System Version (Windows)

WMI Tasks: Operating Systems (Windows)
...determine which version of the Windows operating system is installed on a computer?

El Sanchez 24-03-2010 10:17 1375890

7ka,

Код:

@echo off
ver|find "5.1"&&start "" "Path to installers\installprogXP.exe"||start "" "Path to installers\installprogWin7.exe"

Команда ver покажет версию ОС (результат для XP - Microsoft Windows XP [Версия 5.1.2600]), ver|find "5.1" - поиск текста "5.1" в выводе команды ver, где | - оператор конвейеризации (piping), означающий перенаправление вывода команды, стоящей до оператора, на вход команды, стоящей после оператора.

&&, || - операторы группирования команд.
Команда№1&&Команда№2 - команда№2 исполняется, если исполняется команда№1
Команда№1||Команда№2 - команда№2 исполняется, если не исполняется команда№1

Объединим: Команда№1&&Команда№2||Команда№3 - команда№2 исполняется, если исполняется команда№1, а команда№3 исполняется, если не исполняется команда№2, отсюда вывод:

Если исполнится команда№1 (ver|find "5.1"), то исполнится команда№2 (start "" "Path to installers\installprogXP.exe"), иначе исполнится команда№3 (start "" "Path to installers\installprogWin7.exe")

7ka 24-03-2010 17:34 1376220

Цитата:

Цитата El Sanchez
Если исполнится команда№1 (ver|find "5.1"), то исполнится команда№2 (start "" "Path to installers\installprogXP.exe"), иначе исполнится команда№3 (start "" "Path to installers\installprogWin7.exe") »

а с ключами например:
Код:

ver|find "5.1"&&start "" "%SYSTEMDRIVE%\APPWINXP.MSI /qn /NORESTART"||start "" "%SYSTEMDRIVE%\APPWIN7.EXE /S"
будет работать ?

El Sanchez 24-03-2010 18:19 1376263

Цитата:

Цитата 7ka
будет работать ? »

В кавычки надо заключать только путь к инсталлятору, ключи - нет
Код:

ver|find "5.1"&&start "" "%SYSTEMDRIVE%\APPWINXP.MSI" /qn /NORESTART||start "" "%SYSTEMDRIVE%\APPWIN7.EXE" /S

7ka 24-03-2010 20:20 1376346

Цитата:

Цитата El Sanchez
В кавычки надо заключать только путь к инсталлятору, ключи - нет »

жаль, но всеравно спасибо)

Escalion 26-11-2010 07:25 1551842

Покопался на форуме и исходя из решений пользователей вывел код позволяющий не только определить тип системы, но и ее разрядность:

Код:

Echo Off
 
IF EXIST "%ProgramFiles(x86)%" (
ver|find "5.1"&&Echo Windows XP x64
ver|find "5.2"&&Echo Windows 2003 x64
ver|find "6.0"&&Echo Windows Vista x64
ver|find "6.1"&&Echo Windows Seven x64
goto End
)
ver|find "5.1"&&Echo Windows XP x32
ver|find "5.2"&&Echo Windows 2003 x32
ver|find "6.0"&&Echo Windows Vista x32
ver|find "6.1"&&Echo Windows Seven x32

:End

Провирил код на Windows XP x32 и Windows Seven x64.

seriych 27-11-2010 22:40 1553069

Escalion,
XP 64 вроде имеет код 5.2, как и 2003-я.

Escalion 28-11-2010 07:44 1553286

seriych, Нет. У ХР 5.1, это я проверил (думаю врятли у разных ХР коды могут отличаться). Однако я не проверял коды на 2003 и Висте... возможно и ошибся. Но эти коды я взял из сообщений пользователей этого форума, которые решали подобные задачи на 2003 и Висте.

Ageron 08-08-2011 17:25 1728025

вот еще один рабочий код

Код:

set OS_TYPE=32

IF EXIST "%PROGRAMFILES(x86)%" SET OS_TYPE=64

goto %OS_TYPE%

:32
echo OS_TYPE=%OS_TYPE%
pause

:64
echo OS_TYPE=%OS_TYPE%
pause


sLiDeR-X 24-04-2012 20:17 1905243

Ageron, Escalion, а почему бы не воспользоваться командой %Processor_Architecture%?

Ageron 25-04-2012 14:04 1905674

sLiDeR-X,
на 64 разрядном процессоре может стоять 32 разрядная ос

sLiDeR-X 26-04-2012 11:22 1906087

Ageron, причем здесь процессор.
Насколько я понял, этот параметр показывает версию системы, а не процессора.
http://forum.oszone.net/thread-150321.html

NoIZz 30-07-2012 19:38 1961706

Точнее тип системы
и про какие 64-бит процессоры идет речь? На Итаниумы 32-бит винду на поставишь (%PROCESSOR_ARCHITECTURE%=IA64)
во всех остальных случаях зависит от разрядности ОС

ultra_fs, в русской 7ке ver возвращает Microsoft Windows [Version 6.1.7601]

NoIZz 30-07-2012 20:13 1961722

Определение языка
тк не на всех русских через VER получается определить
В висте и 2008 не проверял - нет под рукой

for /f "tokens=4" %%a in ('chcp') do set CP=%%a
chcp 1251 >nul 2>nul
ver | find "Version">nul && set lng=eng
::Это например для Русской 7ки Professional которая стоит у меня на ноуте - ленгвич паков никаких нет - честно купленная в 2011 коробочная версия
set /? | find "переменных среды">nul && set lng=rus
::Это в русском XP и 2003.
ver | find "Версия">nul && set lng=rus
chcp %CP% >nul 2>nul

переключение кодовой страницы - что бы командная find воспринял кодировку 1251
запоминание - что бы по выходу вернуть ее взад

Lucretius 23-01-2013 21:43 2073514

По выше приведённым примерам собрал скрипт. Скрипт проверил(рабочий) на Win XP home и Win 7. К сожалению не могу проверить на других осях.
Обращаюсь к специалистам с просьбой проверить скрипт на грамотность написания, и по возможности внести поправки (необходимо, чтобы скрипт работал на всей NT-линейке включая x64):
Код:

@echo off

Cls
Echo Сейчас будет создана новая задача для "Prog.exe".
Pause

Rem Наличие установленной программы:

If exist "%ProgramFiles%\Prog\Prog.exe" GoTo More
If not exist "%ProgramFiles%\Prog\Prog.exe" GoTo Error

:Error
Cls
Echo Файл "%ProgramFiles%\Prog\Prog.exe" не найден!
Echo Продолжение невозможно.
Pause
Exit

Rem Название операционной системы:

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

Rem Версия операционной системы:

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.0" GoTo End
If "%version%"=="5.1" GoTo End
If "%version%"=="5.2" GoTo End
If "%version%"=="6.0" GoTo Task
If "%version%"=="6.1" GoTo Task
If "%version%"=="6.2" GoTo Warning

:End
Cls
Echo На %OS1% отсутствует
Echo необходимость в создания данной задачи...
Pause
Exit

:Warning
Cls
Echo Задача не тестировалась на %OS1%!
Echo Введите "Y" чтобы продолжить,
Echo или "N" чтобы выйти из программы.

:Again
Set /p Input=">>> "
If /i Not "%Input%"=="N" (
 If /i Not "%Input%"=="Y" (
  Echo Введите: Y или N
  GoTo Again
 )
)
If /i "%Input%"=="Y" GoTo Task
If /i "%Input%"=="N" Exit

Rem Создание задачи:

:Task
Cls
Echo Создание задачи для "Prog.exe" . . .

Rem код дальше...

В частности интересует реализация определения имени/версии ОС.
Рассматривал вариант получения версии из реестра:
Код:

For /F "Tokens=3" %%A In ('Reg Query "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion" /v CurrentVersion^|Find "REG_SZ"') Do Set Version=%%A
@Echo %Version%

А также упрощённый вариант(без определения имени ОС):
Код:

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 WindowsXP

:WindowsXP
Echo На Windows XP отсутствует
Echo необходимость в создания данной задачи...


Iska 23-01-2013 21:53 2073520

Цитата:

Цитата Lucretius
на всей NT-линейке. »

Начиная с NT 3.1, надо полагать?

Lucretius 23-01-2013 22:04 2073534

Прошу прощения за неточность, начиная с NT 5.0(Win2k).

Super_Kolobok 30-01-2013 21:10 2078822

:: одной строкой - проверка на вин7 русскую х64
ver | find "6.1" >nul && set /? | find "переменных" >nul && if "%ProgramW6432%" Neq "" start /wait vcredist_x64_2012.exe /passive /norestart

Iska 31-01-2013 01:36 2078987

Цитата:

Цитата Super_Kolobok
проверка на вин7 русскую х64 »

Или Server 2008 R2 ;).

Fortress1 31-01-2013 19:57 2079590

у меня есть две винды - 7 и 8. Помогите плиз создать батник который будет определять 7 это или 8, после определения запускать ЕСЛИ 7ка ----> MS Office Starter, ЕСЛИ 8ка - Libre Office.
Заранее спасибо

Если возможно чтобы этот батник мог это же самое делать, только в зависимости от разрядности системы

Super_Kolobok 01-02-2013 11:15 2079977

Если вин7х64 то установить Стартер, если х32 то Либру
ver | find "6.1" >nul && if "%ProgramW6432%" Neq "" (start /wait /d "office\Office2010Starter_RU\" SetupConsumerC2R.exe) else (start /wait /d "office\libre\" msiexec /qb! /i LibO_3.6.5_Win_x86_install_multi.msi ALLUSERS=1 CREATEDESKTOPLINK=1 REGISTER_ALL_MSO_TYPES=1 ISCHECKFORPRODUCTUPDATE=0 %LANG%)

Если вин8х64 то установить Либру, если х32 то Стартер
ver | find "6.2" >nul && if "%ProgramW6432%" Neq "" (start /wait /d "office\libre\" msiexec /qb! /i LibO_3.6.5_Win_x86_install_multi.msi ALLUSERS=1 CREATEDESKTOPLINK=1 REGISTER_ALL_MSO_TYPES=1 ISCHECKFORPRODUCTUPDATE=0 %LANG%) else (start /wait /d "office\Office2010Starter_RU\" SetupConsumerC2R.exe)

Fortress1 02-02-2013 14:06 2080809

Цитата:

Цитата Super_Kolobok
Если вин7х64 то установить Стартер, если х32 то Либру
ver | find "6.1" >nul && if "%ProgramW6432%" Neq "" (start /wait /d "office\Office2010Starter_RU\" SetupConsumerC2R.exe) else (start /wait /d "office\libre\" msiexec /qb! /i LibO_3.6.5_Win_x86_install_multi.msi ALLUSERS=1 CREATEDESKTOPLINK=1 REGISTER_ALL_MSO_TYPES=1 ISCHECKFORPRODUCTUPDATE=0 %LANG%)
Если вин8х64 то установить Либру, если х32 то Стартер
ver | find "6.2" >nul && if "%ProgramW6432%" Neq "" (start /wait /d "office\libre\" msiexec /qb! /i LibO_3.6.5_Win_x86_install_multi.msi ALLUSERS=1 CREATEDESKTOPLINK=1 REGISTER_ALL_MSO_TYPES=1 ISCHECKFORPRODUCTUPDATE=0 %LANG%) else (start /wait /d "office\Office2010Starter_RU\" SetupConsumerC2R.exe) »

Спасибо огромное, только нужно, чтобы
Если вин7х64(x86) то установить Стартер, если вин8х64(x86) то Либру
И возможно ли будет вместо оригинального Либре вставить обрезанную версию(репак) со своими ключами?

Lucretius 03-02-2013 15:08 2081595

Подскажите, как объединить в блок:
Код:

If "%version%"=="5.0" GoTo End
If "%version%"=="5.1" GoTo End
If "%version%"=="5.2" GoTo End


Iska 03-02-2013 19:19 2081761

Код:

for %%i in (5.0 5.1 5.2) do if %%i equ %version% …

Lucretius 03-02-2013 20:40 2081832

Цитата:

Цитата Iska
Код:

for %%i in (5.0 5.1 5.2) do if %%i equ %version% …
»

Спасибо!

Fortress1 07-02-2013 15:07 2084552

@echo
color 0A
echo.

set CurrentOS=notOS
ver|find "6.0">nul&&set CurrentOS=Windows7
ver|find "6.1">nul&&set CurrentOS=Windows7
ver|find "6.2">nul&&set CurrentOS=Windows8

if %CurrentOS%==notOS (
echo _________________________
echo.
echo !ERROR! OS not supported.
echo _________________________
echo.
pause
exit
)
if %CurrentOS%==Windows7(
start /wait "c:\Program Files (x86)\Microsoft Office\Options14\MSOO.exe"
)
if %CurrentOS%==Windows8(
start /wait d:\BSPOST\Install\LibreOffice.exe
)



Подскажите ребят пожалуйста в чем тут моя ошибка....Я выше уже писал...установить на 7ку офис из ПФ, а на 8ку либру.
Заранее спасибо

gora 07-02-2013 15:43 2084584

Код:

if %CurrentOS%==Windows7 (
        "c:\Program Files (x86)\Microsoft Office\Options14\MSOO.exe"
) Else d:\BSPOST\Install\LibreOffice.exe


seriych 08-02-2013 09:03 2085098

Цитата:

Цитата Fortress1
f %CurrentOS%==notOS (
echo _________________________
echo.
echo !ERROR! OS not supported.
echo _________________________
echo.
pause
exit
) »

Хе-хе узнаю свой код, написанный во время работы в hi... :-)

Fortress1 08-02-2013 13:24 2085331

Решил проблему вот этим


@echo off
set SYSTEMID=Windows 7

reg QUERY "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion" /v ProductName | find "Windows 8" >nul
if "%ERRORLEVEL%" == "0" set SYSTEMID=Windows 8

if "%SYSTEMID%" == "Windows 8" (
echo Windows 8
echo Installing Libre Office
"E:\BSPOST\Install\LibreOffice.exe"
echo Done
exit
)

echo Windows 7
echo Installing MS Office 2010
"c:\Program Files (x86)\Microsoft Office\Options14\MSOO.exe"
echo Done
exit

gora 08-02-2013 13:40 2085356

Цитата:

Цитата Fortress1
не запускает файл, только в каталог переводит »

1 Проверьте наличие и правильность написания пути\имени Вашего файла "E:\BSPOST\Install\LibreOffice.exe", может его и нет по этому пути?
2 Проверьте в процессах, появляется ли там процесс LibreOffice.exe

Fortress1 08-02-2013 13:44 2085363

Gora гуру
Подскажи пожалуйста как в этот батник добавить
start /wait
и добавить автоопределение буквы флешки и автоопределение папки программ файлс (т.к. в 32 разрядных системах нет папки х86)

gora 08-02-2013 15:26 2085514

Цитата:

Цитата Fortress1
как в этот батник добавить start /wait »

Дописать в обе строки (хотя я не вижу в этом смысла):
Код:

...
Start /wait "" "E:\BSPOST\Install\LibreOffice.exe"
...
Start /wait "" "c:\Program Files (x86)\Microsoft Office\Options14\MSOO.exe"

Наличие первых пустых кавычек в строке обязательно!
Цитата:

Цитата Fortress1
автоопределение папки программ файлс »

Код:

Set xOS=x64& If "%PROCESSOR_ARCHITECTURE%"=="x86" If Not Defined PROCESSOR_ARCHITEW6432 Set xOS=x86
Set PF=%ProgramFiles%
If %xOS%==x64 Set PF=%ProgramFiles(x86)%
Echo %xOS% %PF%

Цитата:

Цитата Fortress1
автоопределение буквы флешки »

Если с этой флешки запущен сам батник, то можно так:
Код:

Set FlDrv=%~d0

Fortress1 08-02-2013 16:25 2085598

@echo off
set SYSTEMID=Windows 7

reg QUERY "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion" /v ProductName | find "Windows 8" >nul
if "%ERRORLEVEL%" == "0" set SYSTEMID=Windows 8

Set FlDrv=%~d0
Set xOS=x64& If "%PROCESSOR_ARCHITECTURE%"=="x86" If Not Defined PROCESSOR_ARCHITEW6432 Set xOS=x86
Set PF=%ProgramFiles%
If xOS==x64 Set PF=%ProgramFiles(x86)%
Echo %xOS% %PF%

if "%SYSTEMID%" == "Windows 8" (

echo Windows 8
echo Installing Libre Office
Start /wait "" "%~d0\BSPOST\Install\LibreOffice.exe"
echo Done
exit
)

echo Windows 7
echo Installing MS Office 2010
Start /wait "" "%PF%\Microsoft Office\Options14\MSOO.exe"
echo Done
exit



На 8ке любой редакции работает без проблем
На 7ке х64 все равно выдает ошибку в пути к ПФ (ставит обычную ПФ а не х86) (на ноуте с 8кой определил папку ПФх86 правильно)
На 7ке х86 любой редакции работает без проблем
(к счастью ноутов сотня так что тестим мгновенно)

seriych 09-02-2013 09:35 2086142

Fortress1,
Кстати, ты батник запускаешь прямо непосредственно сам, или из какой-то программы оболочки? Просто если из программы оболочки, то она очевидно 32-битная и запущеный дочерний батник будет тоже считаться 32-битным и переменная %ProgramFiles% ему будет возвращаться как %ProgramFiles(x86)% даже если он запущен на 64-битной системе. Там надо в проге перед вызовом батника отключать перенаправление потоков для 32 битных программ, чтобы переменные отдавались как есть.

Fortress1 09-02-2013 10:00 2086147

батник запускаю руками...из проги еще не пробовал

gora 11-02-2013 09:09 2087670

Код:

@echo off
set SYSTEMID=Windows 7
reg QUERY "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion" /v ProductName | find "Windows 8" >nul
if
"%ERRORLEVEL%"=="0" set SYSTEMID=Windows 8

Set FlDrv=%~d0
Set xOS=x64& If "%PROCESSOR_ARCHITECTURE%"=="x86" If Not Defined PROCESSOR_ARCHITEW6432 Set xOS=x86
Set PF=%ProgramFiles(x86)%
If %xOS%==x86 Set PF=%ProgramFiles%
Echo %%xOS%% -                %xOS%
Echo %%PF%% -                %PF%
Echo %%SYSTEMID%% -        %SYSTEMID%
Echo %%FlDrv%% -        %FlDrv%
Echo ====================================================
if "%SYSTEMID%"=="Windows 8" (
        echo Windows 8
        echo Installing Libre Office
        Start /wait "" "%~d0\BSPOST\Install\LibreOffice.exe"
) Else (
        echo Windows 7
        echo Installing MS Office 2010
        Start /wait "" "%PF%\Microsoft Office\Options14\MSOO.exe"
)
echo Done
Pause
exit


Lucretius 11-02-2013 18:54 2088097

А как задать обратное условие, т.е. если Ось 6.0 6.1 6.2 - код дальше, если нет то GoTo.
Код:

For /F "Tokens=2 Delims=[]" %%i In ('ver') Do (
 For /F "Tokens=2,3 Delims=. " %%a In ("%%i") Do Set version=%%a.%%b
)
for %%i in ( 6.0 6.1 6.2 ) do if %%i equ %version%  GoTo Task


gora 11-02-2013 19:14 2088106

Код:

@Echo Off
Ver | Find "6." >nul && Set newver=1
If Defined newver (
        Echo New version
) Else Echo Old version
Pause>nul


Fortress1 11-02-2013 20:59 2088172

Уважаемый Gora

вот скрин этого скрипта, ответ на который выдал системник с х86 ОС



Пробовал как из под BSPOST, так и запущенный руками батник....Итог один - х86 система определяет неправильно

gora 11-02-2013 21:40 2088203

Fortress1, исправил.

Lexod 27-01-2018 22:53 2794135

Здравствуйте, Уважаемые Гуру!

Тема очень старая, но может моя информация окажется полезной. В Windows 7 удалось получить часть информации через WMIC. Часть информации через обращение к реестру недоступна, например, при вызове *.bat - файла из-под Total Commander (например, поле CSDVersion раздела HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion). Работает такая схема (на примере получения названия ОС):

Код:

SET WMICPS=OS
SET WMICPARAM=Caption

FOR /F "delims=" %%a in ('WMIC %WMICPS% GET /FORMAT:LIST ^| FIND /i "%WMICPARAM%"') do ( FOR /F "tokens=1 delims==" %%b in ("%%a") do (IF "%%b"=="%WMICPARAM%" FOR /F "tokens=2 delims==" %%c in ("%%a") do (SET PARAMVOL=%%c)))

где WMICPS - раздел WMIC, WMICPARAM - имя параметра, PARAMVOL - получаемое значение параметра. Второй цикл проверяет полное ли соответствие заданного имени параметра найденной строке, например, для полей Name. Правда, поле Name раздела OS содержит дополнительную строку со спецсимволами, поэтому название ОС пришлось брать по Caption.
Среди прочего по такой схеме:
WMICPARAM=OSArchitecture - архитектура ОС
WMICPARAM=CSDVersion - версия сервис-пака ("" - без сервис-пака).

WMIC также можно использовать для быстрого определения наличия нужного обновления. У меня сработало с использованием временного файла по схеме:

Код:

SET KBLOG=C:\KB.log
WMIC QFE LIST >> %KBLOG%
1>NUL FINDSTR "KB2598845" %KBLOG% || GOTO :Code_If_Installed



Время: 07:21.

Время: 07:21.
© OSzone.net 2001-