1 (изменено: InFlames, 2010-12-24 08:26:56)

Тема: AHK: определить версию Windows

В Windows 7 A_OsVersion показывает Win_XP.
Как другим способом определить какая у меня версия Windows (WIN_XP, VISTA, SEVEN)?

2

Re: AHK: определить версию Windows

http://www.autohotkey.com/forum/topic49168.html#316426
Номера версий здесь.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

3

Re: AHK: определить версию Windows

http://forum.script-coding.com/viewtopic.php?id=4573

4

Re: AHK: определить версию Windows

teadrinker, если запускать ahk на Win7 в режиме совместимости с XP, то покажет, что это XP, а не семерка
(только сейчас понял: в первом посте я написал, что на семерке показывает, что это ХР, это как раз из-за запуска ahk в режиме совместимости)

armenxxx1, мне бы средствами ahk

Неужели нет простого способа на ahk отличить семерку и XP?

5

Re: AHK: определить версию Windows

InFlames пишет:

teadrinker, если запускать ahk на Win7 в режиме совместимости с XP, то покажет, что это XP, а не семерка

Не понял, что "покажет"? Ты скрипт по ссылке запускал?

MsgBox % GetOSVersion()

GetOSVersion() {
    VarSetCapacity(v,148), NumPut(148,v)
    DllCall("GetVersionEx", "uint", &v)
    ; Return formatted version string similar to A_AhkVersion.
    ; Assume build number will never be more than 4 characters.
    return    NumGet(v,4) ; major
        . "." NumGet(v,8) ; minor
        . "." SubStr("0000" NumGet(v,12), -3) ; build
}
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

6

Re: AHK: определить версию Windows

Показывает 5.1.2600.
Это WinXP.
У меня стоит Win7.
Autohotkey.exe запускается в режиме совместимости с WinXP SP3.

7

Re: AHK: определить версию Windows

InFlames пишет:

Autohotkey.exe запускается в режиме совместимости с WinXP SP3.

В этом, видимо, и проблема.
Можно ещё через cmd:

RunWait, cmd /c ver > %A_Temp%\ver,, Hide
FileRead, ver, %A_Temp%\ver
FileDelete, %A_Temp%\ver
DllCall("OemToChar", "Str", ver, "Str", ver)
MsgBox, % ver
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

8

Re: AHK: определить версию Windows

А вот это уже рабочий вариант. Спасибо.
Если не затруднит, напишите, что выдает этот скрипт на WinXP?

9

Re: AHK: определить версию Windows

Microsoft Windows XP [Версия 5.1.2600]

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

10

Re: AHK: определить версию Windows

В каком виде получается результат? Я так понимаю, что это не число после "Version", а какой-то текст.
Вот такой код показывает, что у меня XP, хотя у меня Win7.
Т.е. полученная "6" через RegExReplace не является числом.

RunWait, cmd /c Ver > %A_Temp%\OsVer,, Hide
FileRead, OsVer, %A_Temp%\OsVer
FileDelete, %A_Temp%\OsVer
DllCall("OemToChar", "Str", OsVer, "Str", OsVer)
MsgBox % RegExReplace(OsVer,".*Version\s(\d).+","$1") = 6 ? "win7" : "xp"

11

Re: AHK: определить версию Windows

А у тебя что выдаёт этот скрипт?

RunWait, cmd /c ver > %A_Temp%\ver,, Hide
FileRead, ver, %A_Temp%\ver
FileDelete, %A_Temp%\ver
DllCall("OemToChar", "Str", ver, "Str", ver)
MsgBox, % ver
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

12

Re: AHK: определить версию Windows

А в Windows 7 есть Program Files\Common Files\Microsoft Shared\MSInfo\msinfo32.exe ?

13

Re: AHK: определить версию Windows

teadrinker

Microsoft Windows [Version 6.1.7600]

ypppu
Да, есть.

14

Re: AHK: определить версию Windows

Оказывается, cmd записывает в файл два переноса строки, один перед значением, другой после:

RunWait, cmd /c ver > %A_Temp%\ver,, Hide
FileRead, ver, %A_Temp%\ver
FileDelete, %A_Temp%\ver
DllCall("OemToChar", "Str", ver, "Str", ver)
MsgBox, % "[" ver "]"

Попробуй так:

RunWait, cmd /c Ver > %A_Temp%\OsVer,, Hide
FileRead, OsVer, %A_Temp%\OsVer
FileDelete, %A_Temp%\OsVer
DllCall("OemToChar", "Str", OsVer, "Str", OsVer)
ver := RegExReplace(OsVer, "s).*?(\d\.\d).*", "$1")
MsgBox, % ver = 5.1 ? "xp" : ver = 6.1 ? "win7" : "другая ОС"
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

15

Re: AHK: определить версию Windows

Это рабочий вариант.
Спасибо.

16

Re: AHK: определить версию Windows

Есть возможность сохранять вывод из cmd непосредственно в переменную, без создания дополнительных файлов. Немного модифицированный мною вариант:

Output := CMDret_RunReturn("cmd /c ver")
DllCall("OemToChar", "Str", Output, "Str", Output)   ; эта строка нужна, если в выводе присутствует кириллица
MsgBox, % Output
Return

CMDret_RunReturn(CMDin)
{
  Global cmdretPID   ; for external abort
  dly := (A_BatchLines <> -1) * 50 ; needs longer delay when Batchlines <> -1

  VarSetCapacity(lpBuffer,1024)
  VarSetCapacity(sui,68, 0)
  VarSetCapacity(pi, 16, 0)
  VarSetCapacity(pa, 12, 0)
  NumPut( 12, pa, 0)
  NumPut( 1,  pa, 8)

  IF (DllCall("CreatePipe", "UInt*",hRead, "UInt*",hWrite, UInt,&pa, Int,0) <> 0) {
    NumPut(68,    sui, 0 )
    DllCall("GetStartupInfo", "UInt", &sui)
    NumPut(0x101, sui, 44)
    NumPut(0,     sui, 48)
    NumPut(hWrite,sui, 60)
    NumPut(hWrite,sui, 64)

    IF (DllCall("CreateProcess",Int,0,Str,CMDin,Int,0,Int,0,Int,1,UInt,0,Int,0,Int,0,UInt,&sui,UInt,&pi)<>0) {
      cmdretPID := NumGet(pi, 8)
      Loop {
        IF DllCall("PeekNamedPipe",uint,hRead, uint,0, uint,0, uint,0, "UInt*",bSize, uint,0) = 0
          break
        Process Exist, %cmdretPID%
        If (ErrorLevel = 0 and bsize = 0)
          break
        If (bsize = 0) {
          Sleep %dly% ; only sleep before early continue
          Continue
        }
        VarSetCapacity(lpBuffer, bSize, 0)
        IF (DllCall("ReadFile",UInt,hRead, Str,lpBuffer, Int,bSize, "UInt*",bRead, Int,0) > 0) {
          IFEqual bRead,0, Continue
          CMDout = %CMDout%%lpBuffer%
          }
      } ; Loop
      cmdretPID =
    } ; IF CreateProcess

    DllCall("CloseHandle", UInt, hWrite)
    DllCall("CloseHandle", UInt, hRead)
  } ; IF CreatePipe

  Return CMDout
}
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder