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

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   AutoIt (http://forum.oszone.net/forumdisplay.php?f=103)
-   -   [решено] Версия WinVer.exe и создание переменной (http://forum.oszone.net/showthread.php?t=284591)

KopBuH91 04-07-2014 20:46 2372157

Версия WinVer.exe и создание переменной
 
Всем привет :)
нужна небольшая помощь профи в языке AutoIT3, а именно:
скрипт, который читает версию файла WinVer.exe по такому пути: %OFFLINESYSTEM%\System32\winver.exe и создает локальную (пользовательскую) переменную %OFFLINESYSTEMVER%, опустив версию Bild'a, то есть только номер 6.0/6.1/6.2/6.3
может кто нибудь помочь?.

madmasles 04-07-2014 21:39 2372169

KopBuH91,
У меня нет переменной %OFFLINESYSTEM%, проверял на %WINDIR%
Код:

$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)

А дальше смотрите сначала это: SetX, а потом в справке команду Run (там, где Run(@ComSpec & ' /C ...)

KopBuH91 04-07-2014 21:57 2372173

Спасибо, и если не трудно, еще один небольшой нюанс:
как бы сделать так, чтобы скрипт еще и записывал значение в реестр, например в HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment
параметр OFFLINESYSTEMVER в DWORD?
?

madmasles 04-07-2014 22:09 2372177

Цитата:

Цитата KopBuH91
параметр OFFLINESYSTEMVER в DWORD »

Так запишется только 6, а не 6.1.
Можно так сделать (запишется 6100).
Код:

;~ #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_DWORD', $sVers * 1000)
If @error Then Exit 3

Или так.
Код:

$sVers = '6.1'
$aVers = StringSplit($sVers, '.')
$bVers = BitOR(BitShift($aVers[1], -8), $aVers[2])
ConsoleWrite($bVers & @TAB & '0x' & Hex($bVers, 4) & @LF)


KopBuH91 05-07-2014 08:14 2372247

ок, неподумал, что походу 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 2372272

Цитата:

Цитата 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''')


madmasles 05-07-2014 11:19 2372296

Цитата:

Цитата KopBuH91
вроде работает »

Можно использовать или SETX, или RegWrite. В SETX у Вас ошибка, должно быть
Код:

Run(@ComSpec & ' /C SETX OFFLINESYSTEMVER ' & $sVers, '', @SW_HIDE)

KopBuH91 05-07-2014 12:15 2372312

думаю, если нет параметров, то должен запускаться обычный код скрипта, который мы сделали выше.
сообщения думаю надо убрать. нет параметров - запускается обычный режим (прямой):

Код:

;~ #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 2372320

Цитата:

Цитата madmasles
как будут называться новые переменные »

Если есть нужный параметр?

KopBuH91 05-07-2014 13:06 2372326

если есть параметр /auto - тогда перебор дисков на наличие папки Windows и чтение версии WinVer.exe из первой попавшейся (за исключением диска X: ) и пропуск переменной OFFLINESYSTEMDRIVE
а так всё тоже самое. результатом будет таже самая запись в реестр.

madmasles 05-07-2014 13:26 2372330

Цитата:

Цитата KopBuH91
чтение версии WinVer.exe из первой попавшейся »

У меня, например, на диске C:\ стоит Windows 7, а на E:\ - Windows XP. Какая версия будет нужна?

KopBuH91 05-07-2014 14:22 2372346

семейство NT6, то есть от Vista и выше.
а так - под 90% случаев этот вариант подходит - ведь 2 системы на одном HDD - редкость.
к тому же, если нужен конкретный выбор - у нас есть переменная, в которой содержится буква нужного диска.
а нет выбора (/auto) - пусть будет первая попавшаяся, по порядке букв, начиная с C:, исключая X:.

madmasles 06-07-2014 06:58 2372592

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.

Время: 20:48.
© OSzone.net 2001-