Тема: AHK: определить версию Windows
В Windows 7 A_OsVersion показывает Win_XP.
Как другим способом определить какая у меня версия Windows (WIN_XP, VISTA, SEVEN)?
Вы не вошли. Пожалуйста, войдите или зарегистрируйтесь.
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться
В Windows 7 A_OsVersion показывает Win_XP.
Как другим способом определить какая у меня версия Windows (WIN_XP, VISTA, SEVEN)?
http://www.autohotkey.com/forum/topic49168.html#316426
Номера версий здесь.
teadrinker, если запускать ahk на Win7 в режиме совместимости с XP, то покажет, что это XP, а не семерка
(только сейчас понял: в первом посте я написал, что на семерке показывает, что это ХР, это как раз из-за запуска ahk в режиме совместимости)
armenxxx1, мне бы средствами ahk
Неужели нет простого способа на ahk отличить семерку и XP?
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
}
Показывает 5.1.2600.
Это WinXP.
У меня стоит Win7.
Autohotkey.exe запускается в режиме совместимости с WinXP SP3.
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
А вот это уже рабочий вариант. Спасибо.
Если не затруднит, напишите, что выдает этот скрипт на WinXP?
Microsoft Windows XP [Версия 5.1.2600]
В каком виде получается результат? Я так понимаю, что это не число после "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"
А у тебя что выдаёт этот скрипт?
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
А в Windows 7 есть Program Files\Common Files\Microsoft Shared\MSInfo\msinfo32.exe ?
teadrinker
Microsoft Windows [Version 6.1.7600]
ypppu
Да, есть.
Оказывается, 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" : "другая ОС"
Это рабочий вариант.
Спасибо.
Есть возможность сохранять вывод из 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
}
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться