-
AutoIt
(
http://forum.oszone.net/forumdisplay.php?f=103)
Версия WinVer.exe и создание переменной
Всем привет :)
нужна небольшая помощь профи в языке AutoIT3, а именно:
скрипт, который читает версию файла WinVer.exe по такому пути: %OFFLINESYSTEM%\System32\winver.exe и создает локальную (пользовательскую) переменную %OFFLINESYSTEMVER%, опустив версию Bild'a, то есть только номер 6.0/6.1/6.2/6.3
может кто нибудь помочь?.
|
KopBuH91,
У меня нет переменной %OFFLINESYSTEM%, проверял на %WINDIR%А дальше смотрите сначала это: SetX, а потом в справке команду Run (там, где Run(@ComSpec & ' /C ...)
|
Спасибо, и если не трудно, еще один небольшой нюанс:
как бы сделать так, чтобы скрипт еще и записывал значение в реестр, например в HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment
параметр OFFLINESYSTEMVER в DWORD?
?
|
Цитата:
Цитата KopBuH91
параметр OFFLINESYSTEMVER в DWORD »
|
Так запишется только 6, а не 6.1.
Можно так сделать (запишется 6100). Или так.
|
ок, неподумал, что походу 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, использовал её вместо переменной?
|
Цитата:
Цитата KopBuH91
чтобы запущенный с параметром /auto скрипт »
|
Можно примерно так сделать, только мне не понятно, как будут называться новые переменные, и что делать, если или нет параметров, или нет параметра " /auto".
Код:
#include <Array.au3>;нужен только для отладки (показать массив $aWinVers _ArrayDisplay($aWinVers)
Global $aWinVers[24], $sDrive
If $CmdLine[0] Then
If StringRegExp($CmdLineRaw, '(?<=^|\x{20})([''"]{0,1}/auto[''"]{0,1})(?=\x{20}|$)') Then
For $i = 67 To 90
If $i = 88 Then ContinueLoop
$sDrive = Chr($i)
If FileExists($sDrive & ':\Windows\System32\winver.exe') Then
$aWinVers[0] += 1
$aWinVers[$aWinVers[0]] = $sDrive & ':\Windows\System32\winver.exe'
EndIf
Next
$sDrive = ''
ReDim $aWinVers[$aWinVers[0] + 1]
_ArrayDisplay($aWinVers)
Else
MsgBox(16, 'Error', 'Нет параметра " /auto".')
;~ ;здесь не знаю, что должно быть, если нет параметра ' /auto'
EndIf
Else
MsgBox(16, 'Error', 'Нет параметров.')
;~ ;здесь не знаю, что должно быть, если нет параметров.
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''')
|
Можно использовать или SETX, или RegWrite. В SETX у Вас ошибка, должно быть
|
думаю, если нет параметров, то должен запускаться обычный код скрипта, который мы сделали выше.
сообщения думаю надо убрать. нет параметров - запускается обычный режим (прямой):
Код:
;~ #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
как будут называться новые переменные »
|
Если есть нужный параметр?
|
если есть параметр /auto - тогда перебор дисков на наличие папки Windows и чтение версии WinVer.exe из первой попавшейся (за исключением диска X: ) и пропуск переменной OFFLINESYSTEMDRIVE
а так всё тоже самое. результатом будет таже самая запись в реестр.
|
Цитата:
Цитата KopBuH91
чтение версии WinVer.exe из первой попавшейся »
|
У меня, например, на диске C:\ стоит Windows 7, а на E:\ - Windows XP. Какая версия будет нужна?
|
семейство NT6, то есть от Vista и выше.
а так - под 90% случаев этот вариант подходит - ведь 2 системы на одном HDD - редкость.
к тому же, если нужен конкретный выбор - у нас есть переменная, в которой содержится буква нужного диска.
а нет выбора (/auto) - пусть будет первая попавшаяся, по порядке букв, начиная с C:, исключая X:.
|
KopBuH91,
Попробуйте сделать примерно так.
Код:
Global $sPath, $sVers
If $CmdLine[0] Then
If StringRegExp($CmdLineRaw, '(?<=^|\x{20})([''"]{0,1}/auto[''"]{0,1})(?=\x{20}|$)') Then
_FindFirstWinDir($sPath)
;~ или, как вариант:
;~ If Not _FindFirstWinDir($sPath) Then Exit MsgBox(16, 'Error', 'Не нашли ни одного диска с папкой Windows')
EndIf
EndIf
If Not $sPath Then
$sPath = EnvGet('OFFLINESYSTEM');или OFFLINESYSTEMDRIVE?
If Not $sPath Then Exit MsgBox(16, 'Error', 'Нет переменной %OFFLINESYSTEM%');или OFFLINESYSTEMDRIVE?
EndIf
$sVers = FileGetVersion($sPath & '\System32\winver.exe')
$sVers = StringRegExpReplace($sVers, '^(\d+\.\d+).*', '$1')
If @extended <> 1 Then Exit MsgBox(16, 'Error', 'Ошибка получения версии winver.exe')
If EnvGet('OFFLINESYSTEMVER') = $sVers Then Exit MsgBox(64, 'Info', 'Переменная OFFLINESYSTEMVER со значением ' & $sVers & ' уже есть')
If Not RegWrite('HKEY_CURRENT_USER\Environment', 'OFFLINESYSTEMVER', 'REG_SZ', $sVers) Then
Exit MsgBox(16, 'Error', 'Ошибка записи переменной OFFLINESYSTEMVER в реестр')
EndIf
Func _FindFirstWinDir(ByRef $s_Path)
Local $s_Drive
For $i = 67 To 90
If $i = 88 Then ContinueLoop
$s_Drive = Chr($i)
If FileExists($s_Drive & ':\Windows\') Then
$s_Path = $s_Drive & ':\Windows'
Return 1
EndIf
Next
Return 0
EndFunc ;==>_FindFirstWinDir
;~ Run('"' & @ScriptDir & '\test.exe" /auto')
|
Время: 20:48.
© OSzone.net 2001-