Показать полную графическую версию : [решено] Версия WinVer.exe и создание переменной
KopBuH91
04-07-2014, 20:46
Всем привет :)
нужна небольшая помощь профи в языке AutoIT3, а именно:
скрипт, который читает версию файла WinVer.exe по такому пути: %OFFLINESYSTEM%\System32\winver.exe и создает локальную (пользовательскую) переменную %OFFLINESYSTEMVER%, опустив версию Bild'a, то есть только номер 6.0/6.1/6.2/6.3
может кто нибудь помочь?.
madmasles
04-07-2014, 21:39
KopBuH91,
У меня нет переменной %OFFLINESYSTEM%, проверял на %WINDIR%$sPath = EnvGet (http://autoit-script.ru/autoit3_docs/functions/EnvGet.htm)('WINDIR');EnvGet('OFFLINESYSTEM')
If (http://www.autoitscript.com/autoit3/docs/keywords.htm#If) Not (http://www.autoitscript.com/autoit3/docs/keywords.htm#Not) $sPath Then (http://www.autoitscript.com/autoit3/docs/keywords.htm#Then) Exit (http://www.autoitscript.com/autoit3/docs/keywords.htm#Exit) 1
$sVers = FileGetVersion (http://autoit-script.ru/autoit3_docs/functions/FileGetVersion.htm)($sPath & '\System32\winver.exe')
$sVers = StringRegExpReplace (http://autoit-script.ru/autoit3_docs/functions/StringRegExpReplace.htm)($sVers, '^(\d+\.\d+).*', '$1')
If (http://www.autoitscript.com/autoit3/docs/keywords.htm#If) @extended (http://autoit-script.ru/autoit3_docs/macros.htm#@extended) <> 1 Then (http://www.autoitscript.com/autoit3/docs/keywords.htm#Then) Exit (http://www.autoitscript.com/autoit3/docs/keywords.htm#Exit) 2
ConsoleWrite (http://autoit-script.ru/autoit3_docs/functions/ConsoleWrite.htm)($sVers & @LF (http://autoit-script.ru/autoit3_docs/macros.htm#@lf))А дальше смотрите сначала это: SetX (http://ab57.ru/cmdlist/setx.html), а потом в справке команду Run (там, где Run(@ComSpec & ' /C ...)
KopBuH91
04-07-2014, 21:57
Спасибо, и если не трудно, еще один небольшой нюанс:
как бы сделать так, чтобы скрипт еще и записывал значение в реестр, например в HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment
параметр OFFLINESYSTEMVER в DWORD?
?
madmasles
04-07-2014, 22:09
параметр OFFLINESYSTEMVER в DWORD »Так запишется только 6, а не 6.1.
Можно так сделать (запишется 6100).;~ #RequireAdmin; для записи в HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment
$sPath = EnvGet (http://autoit-script.ru/autoit3_docs/functions/EnvGet.htm)('WINDIR');EnvGet('OFFLINESYSTEM')
If (http://www.autoitscript.com/autoit3/docs/keywords.htm#If) Not (http://www.autoitscript.com/autoit3/docs/keywords.htm#Not) $sPath Then (http://www.autoitscript.com/autoit3/docs/keywords.htm#Then) Exit (http://www.autoitscript.com/autoit3/docs/keywords.htm#Exit) 1
$sVers = FileGetVersion (http://autoit-script.ru/autoit3_docs/functions/FileGetVersion.htm)($sPath & '\System32\winver.exe')
$sVers = StringRegExpReplace (http://autoit-script.ru/autoit3_docs/functions/StringRegExpReplace.htm)($sVers, '^(\d+\.\d+).*', '$1')
If (http://www.autoitscript.com/autoit3/docs/keywords.htm#If) @extended (http://autoit-script.ru/autoit3_docs/macros.htm#@extended) <> 1 Then (http://www.autoitscript.com/autoit3/docs/keywords.htm#Then) Exit (http://www.autoitscript.com/autoit3/docs/keywords.htm#Exit) 2
ConsoleWrite (http://autoit-script.ru/autoit3_docs/functions/ConsoleWrite.htm)($sVers & @LF (http://autoit-script.ru/autoit3_docs/macros.htm#@lf))
RegWrite (http://autoit-script.ru/autoit3_docs/functions/RegWrite.htm)('HKEY_CURRENT_USER\Environment', 'OFFLINESYSTEMVER', 'REG_DWORD', $sVers * 1000)
If (http://www.autoitscript.com/autoit3/docs/keywords.htm#If) @error (http://autoit-script.ru/autoit3_docs/macros.htm#@error) Then (http://www.autoitscript.com/autoit3/docs/keywords.htm#Then) Exit (http://www.autoitscript.com/autoit3/docs/keywords.htm#Exit) 3Или так.$sVers = '6.1'
$aVers = StringSplit (http://autoit-script.ru/autoit3_docs/functions/StringSplit.htm)($sVers, '.')
$bVers = BitOR (http://autoit-script.ru/autoit3_docs/functions/BitOR.htm)(BitShift (http://autoit-script.ru/autoit3_docs/functions/BitShift.htm)($aVers[1], -8), $aVers[2])
ConsoleWrite (http://autoit-script.ru/autoit3_docs/functions/ConsoleWrite.htm)($bVers & @TAB (http://autoit-script.ru/autoit3_docs/macros.htm#@tab) & '0x' & Hex (http://autoit-script.ru/autoit3_docs/functions/Hex.htm)($bVers, 4) & @LF (http://autoit-script.ru/autoit3_docs/macros.htm#@lf))
KopBuH91
05-07-2014, 08:14
ок, неподумал, что походу REG_SZ подходит лучше.
примерно так:
;~ #RequireAdmin; для записи в HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment
$sPath = EnvGet('WINDIR');EnvGet('OFFLINESYSTEM')
If Not $sPath Then Exit 1
$sVers = FileGetVersion($sPath & '\System32\winver.exe')
$sVers = StringRegExpReplace($sVers, '^(\d+\.\d+).*', '$1')
If @extended <> 1 Then Exit 2
ConsoleWrite($sVers & @LF)
RegWrite('HKEY_CURRENT_USER\Environment', 'OFFLINESYSTEMVER', 'REG_SZ', $sVers)
Run(@ComSpec & ' /C SETX OFFLINESYSTEMVER & $sVers"', '', @SW_HIDE)
If @error Then Exit 3
вроде работает
теперь как бы сделать так, чтобы запущенный с параметром /auto скрипт, вместо конкретно заданной переменной (WINDIR,OFFLINESYSTEM), перебирал диск, начиная с C: (но пропуская X: ) и дальше, и при наличии папки Windows, использовал её вместо переменной?
madmasles
05-07-2014, 09:59
чтобы запущенный с параметром /auto скрипт »Можно примерно так сделать, только мне не понятно, как будут называться новые переменные, и что делать, если или нет параметров, или нет параметра " /auto".#include (http://autoit-script.ru/autoit3_docs/keywords.htm##include) <Array.au3>;нужен только для отладки (показать массив $aWinVers _ArrayDisplay($aWinVers)
Global (http://www.autoitscript.com/autoit3/docs/keywords.htm#Global) $aWinVers[24], $sDrive
If (http://www.autoitscript.com/autoit3/docs/keywords.htm#If) $CmdLine[0] Then (http://www.autoitscript.com/autoit3/docs/keywords.htm#Then)
If (http://www.autoitscript.com/autoit3/docs/keywords.htm#If) StringRegExp (http://autoit-script.ru/autoit3_docs/functions/StringRegExp.htm)($CmdLineRaw, '(?<=^|\x{20})([''"]{0,1}/auto[''"]{0,1})(?=\x{20}|$)') Then (http://www.autoitscript.com/autoit3/docs/keywords.htm#Then)
For (http://www.autoitscript.com/autoit3/docs/keywords.htm#For) $i = 67 To (http://www.autoitscript.com/autoit3/docs/keywords.htm#To) 90
If (http://www.autoitscript.com/autoit3/docs/keywords.htm#If) $i = 88 Then (http://www.autoitscript.com/autoit3/docs/keywords.htm#Then) ContinueLoop (http://www.autoitscript.com/autoit3/docs/keywords.htm#ContinueLoop)
$sDrive = Chr (http://autoit-script.ru/autoit3_docs/functions/Chr.htm)($i)
If (http://www.autoitscript.com/autoit3/docs/keywords.htm#If) FileExists (http://autoit-script.ru/autoit3_docs/functions/FileExists.htm)($sDrive & ':\Windows\System32\winver.exe') Then (http://www.autoitscript.com/autoit3/docs/keywords.htm#Then)
$aWinVers[0] += 1
$aWinVers[$aWinVers[0]] = $sDrive & ':\Windows\System32\winver.exe'
EndIf (http://www.autoitscript.com/autoit3/docs/keywords.htm#EndIf)
Next (http://www.autoitscript.com/autoit3/docs/keywords.htm#Next)
$sDrive = ''
ReDim (http://www.autoitscript.com/autoit3/docs/keywords.htm#ReDim) $aWinVers[$aWinVers[0] + 1]
_ArrayDisplay (http://autoit-script.ru/autoit3_docs/libfunctions/_arraydisplay.htm)($aWinVers)
Else (http://www.autoitscript.com/autoit3/docs/keywords.htm#Else)
MsgBox (http://autoit-script.ru/autoit3_docs/functions/MsgBox.htm)(16, 'Error', 'Нет параметра " /auto".')
;~ ;здесь не знаю, что должно быть, если нет параметра ' /auto'
EndIf (http://www.autoitscript.com/autoit3/docs/keywords.htm#EndIf)
Else (http://www.autoitscript.com/autoit3/docs/keywords.htm#Else)
MsgBox (http://autoit-script.ru/autoit3_docs/functions/MsgBox.htm)(16, 'Error', 'Нет параметров.')
;~ ;здесь не знаю, что должно быть, если нет параметров.
EndIf (http://www.autoitscript.com/autoit3/docs/keywords.htm#EndIf)
;~ запускать можно так:
;~ Run('"' & @ScriptDir & '\test.exe" "test param" "next param" "/auto" "param"')
;~ Run('"' & @ScriptDir & '\test.exe" /auto "test param" "next param" "param"')
;~ Run('"' & @ScriptDir & '\test.exe" "test param" "next param" "param" ''/auto''')
;~ Run('"' & @ScriptDir & '\test.exe" /auto')
;~ Run('"' & @ScriptDir & '\test.exe" "/auto"')
;~ Run('"' & @ScriptDir & '\test.exe" ''/auto''')
madmasles
05-07-2014, 11:19
вроде работает »Можно использовать или SETX, или RegWrite. В SETX у Вас ошибка, должно бытьRun (http://autoit-script.ru/autoit3_docs/functions/Run.htm)(@ComSpec (http://autoit-script.ru/autoit3_docs/macros.htm#@comspec) & ' /C SETX OFFLINESYSTEMVER ' & $sVers, '', @SW_HIDE (http://autoit-script.ru/autoit3_docs/macros.htm#@sw_hide))
KopBuH91
05-07-2014, 12:15
думаю, если нет параметров, то должен запускаться обычный код скрипта, который мы сделали выше.
сообщения думаю надо убрать. нет параметров - запускается обычный режим (прямой):
;~ #RequireAdmin; для записи в HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment
$sPath = EnvGet('OFFLINESYSTEM');EnvGet('WINDIR')
If Not $sPath Then Exit 1
$sVers = FileGetVersion($sPath & '\System32\winver.exe')
$sVers = StringRegExpReplace($sVers, '^(\d+\.\d+).*', '$1')
If @extended <> 1 Then Exit 2
ConsoleWrite($sVers & @LF)
RegWrite('HKEY_CURRENT_USER\Environment', 'OFFLINESYSTEMVER', 'REG_SZ', $sVers)
Run(@ComSpec & ' /C SETX OFFLINESYSTEMVER ' & $sVers, '', @SW_HIDE)
If @error Then Exit 3
madmasles
05-07-2014, 12:37
как будут называться новые переменные »Если есть нужный параметр?
KopBuH91
05-07-2014, 13:06
если есть параметр /auto - тогда перебор дисков на наличие папки Windows и чтение версии WinVer.exe из первой попавшейся (за исключением диска X: ) и пропуск переменной OFFLINESYSTEMDRIVE
а так всё тоже самое. результатом будет таже самая запись в реестр.
madmasles
05-07-2014, 13:26
чтение версии WinVer.exe из первой попавшейся »У меня, например, на диске C:\ стоит Windows 7, а на E:\ - Windows XP. Какая версия будет нужна?
KopBuH91
05-07-2014, 14:22
семейство NT6, то есть от Vista и выше.
а так - под 90% случаев этот вариант подходит - ведь 2 системы на одном HDD - редкость.
к тому же, если нужен конкретный выбор - у нас есть переменная, в которой содержится буква нужного диска.
а нет выбора (/auto) - пусть будет первая попавшаяся, по порядке букв, начиная с C:, исключая X:.
madmasles
06-07-2014, 06:58
KopBuH91,
Попробуйте сделать примерно так.Global (http://www.autoitscript.com/autoit3/docs/keywords.htm#Global) $sPath, $sVers
If (http://www.autoitscript.com/autoit3/docs/keywords.htm#If) $CmdLine[0] Then (http://www.autoitscript.com/autoit3/docs/keywords.htm#Then)
If (http://www.autoitscript.com/autoit3/docs/keywords.htm#If) StringRegExp (http://autoit-script.ru/autoit3_docs/functions/StringRegExp.htm)($CmdLineRaw, '(?<=^|\x{20})([''"]{0,1}/auto[''"]{0,1})(?=\x{20}|$)') Then (http://www.autoitscript.com/autoit3/docs/keywords.htm#Then)
_FindFirstWinDir($sPath)
;~ или, как вариант:
;~ If Not _FindFirstWinDir($sPath) Then Exit MsgBox(16, 'Error', 'Не нашли ни одного диска с папкой Windows')
EndIf (http://www.autoitscript.com/autoit3/docs/keywords.htm#EndIf)
EndIf (http://www.autoitscript.com/autoit3/docs/keywords.htm#EndIf)
If (http://www.autoitscript.com/autoit3/docs/keywords.htm#If) Not (http://www.autoitscript.com/autoit3/docs/keywords.htm#Not) $sPath Then (http://www.autoitscript.com/autoit3/docs/keywords.htm#Then)
$sPath = EnvGet (http://autoit-script.ru/autoit3_docs/functions/EnvGet.htm)('OFFLINESYSTEM');или OFFLINESYSTEMDRIVE?
If (http://www.autoitscript.com/autoit3/docs/keywords.htm#If) Not (http://www.autoitscript.com/autoit3/docs/keywords.htm#Not) $sPath Then (http://www.autoitscript.com/autoit3/docs/keywords.htm#Then) Exit (http://www.autoitscript.com/autoit3/docs/keywords.htm#Exit) MsgBox (http://autoit-script.ru/autoit3_docs/functions/MsgBox.htm)(16, 'Error', 'Нет переменной %OFFLINESYSTEM%');или OFFLINESYSTEMDRIVE?
EndIf (http://www.autoitscript.com/autoit3/docs/keywords.htm#EndIf)
$sVers = FileGetVersion (http://autoit-script.ru/autoit3_docs/functions/FileGetVersion.htm)($sPath & '\System32\winver.exe')
$sVers = StringRegExpReplace (http://autoit-script.ru/autoit3_docs/functions/StringRegExpReplace.htm)($sVers, '^(\d+\.\d+).*', '$1')
If (http://www.autoitscript.com/autoit3/docs/keywords.htm#If) @extended (http://autoit-script.ru/autoit3_docs/macros.htm#@extended) <> 1 Then (http://www.autoitscript.com/autoit3/docs/keywords.htm#Then) Exit (http://www.autoitscript.com/autoit3/docs/keywords.htm#Exit) MsgBox (http://autoit-script.ru/autoit3_docs/functions/MsgBox.htm)(16, 'Error', 'Ошибка получения версии winver.exe')
If (http://www.autoitscript.com/autoit3/docs/keywords.htm#If) EnvGet (http://autoit-script.ru/autoit3_docs/functions/EnvGet.htm)('OFFLINESYSTEMVER') = $sVers Then (http://www.autoitscript.com/autoit3/docs/keywords.htm#Then) Exit (http://www.autoitscript.com/autoit3/docs/keywords.htm#Exit) MsgBox (http://autoit-script.ru/autoit3_docs/functions/MsgBox.htm)(64, 'Info', 'Переменная OFFLINESYSTEMVER со значением ' & $sVers & ' уже есть')
If (http://www.autoitscript.com/autoit3/docs/keywords.htm#If) Not (http://www.autoitscript.com/autoit3/docs/keywords.htm#Not) RegWrite (http://autoit-script.ru/autoit3_docs/functions/RegWrite.htm)('HKEY_CURRENT_USER\Environment', 'OFFLINESYSTEMVER', 'REG_SZ', $sVers) Then (http://www.autoitscript.com/autoit3/docs/keywords.htm#Then)
Exit (http://www.autoitscript.com/autoit3/docs/keywords.htm#Exit) MsgBox (http://autoit-script.ru/autoit3_docs/functions/MsgBox.htm)(16, 'Error', 'Ошибка записи переменной OFFLINESYSTEMVER в реестр')
EndIf (http://www.autoitscript.com/autoit3/docs/keywords.htm#EndIf)
Func (http://www.autoitscript.com/autoit3/docs/keywords.htm#Func) _FindFirstWinDir(ByRef (http://www.autoitscript.com/autoit3/docs/keywords.htm#ByRef) $s_Path)
Local (http://www.autoitscript.com/autoit3/docs/keywords.htm#Local) $s_Drive
For (http://www.autoitscript.com/autoit3/docs/keywords.htm#For) $i = 67 To (http://www.autoitscript.com/autoit3/docs/keywords.htm#To) 90
If (http://www.autoitscript.com/autoit3/docs/keywords.htm#If) $i = 88 Then (http://www.autoitscript.com/autoit3/docs/keywords.htm#Then) ContinueLoop (http://www.autoitscript.com/autoit3/docs/keywords.htm#ContinueLoop)
$s_Drive = Chr (http://autoit-script.ru/autoit3_docs/functions/Chr.htm)($i)
If (http://www.autoitscript.com/autoit3/docs/keywords.htm#If) FileExists (http://autoit-script.ru/autoit3_docs/functions/FileExists.htm)($s_Drive & ':\Windows\') Then (http://www.autoitscript.com/autoit3/docs/keywords.htm#Then)
$s_Path = $s_Drive & ':\Windows'
Return (http://www.autoitscript.com/autoit3/docs/keywords.htm#Return) 1
EndIf (http://www.autoitscript.com/autoit3/docs/keywords.htm#EndIf)
Next (http://www.autoitscript.com/autoit3/docs/keywords.htm#Next)
Return (http://www.autoitscript.com/autoit3/docs/keywords.htm#Return) 0
EndFunc (http://www.autoitscript.com/autoit3/docs/keywords.htm#EndFunc) ;==>_FindFirstWinDir
;~ Run('"' & @ScriptDir & '\test.exe" /auto')
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.