[решено] Версия WinVer.exe и создание переменной

Аватара пользователя
KopBuH91

[решено] Версия WinVer.exe и создание переменной

Сообщение KopBuH91 »

Всем привет Изображение

нужна небольшая помощь профи в языке AutoIT3, а именно:

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

может кто нибудь помочь?.
Аватара пользователя
madmasles

Re: [решено] Версия WinVer.exe и создание переменной

Сообщение madmasles »

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

Re: [решено] Версия WinVer.exe и создание переменной

Сообщение KopBuH91 »

Спасибо, и если не трудно, еще один небольшой нюанс:

как бы сделать так, чтобы скрипт еще и записывал значение в реестр, например в HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment

параметр OFFLINESYSTEMVER в DWORD?

?
Аватара пользователя
madmasles

Re: [решено] Версия WinVer.exe и создание переменной

Сообщение madmasles »

Цитата KopBuH91:



параметр OFFLINESYSTEMVER в DWORD
[решено] Версия WinVer.exe и создание переменной




Так запишется только 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

Re: [решено] Версия WinVer.exe и создание переменной

Сообщение KopBuH91 »

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

Re: [решено] Версия WinVer.exe и создание переменной

Сообщение madmasles »

Цитата KopBuH91:



чтобы запущенный с параметром /auto скрипт
[решено] Версия WinVer.exe и создание переменной




Можно примерно так сделать, только мне не понятно, как будут называться новые переменные, и что делать, если или нет параметров, или нет параметра " /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

Re: [решено] Версия WinVer.exe и создание переменной

Сообщение madmasles »

Цитата KopBuH91:



вроде работает
[решено] Версия WinVer.exe и создание переменной




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

Код:

Код: Выделить всё

Run(@ComSpec & ' /C SETX OFFLINESYSTEMVER ' & $sVers, '', @SW_HIDE)
Аватара пользователя
KopBuH91

Re: [решено] Версия WinVer.exe и создание переменной

Сообщение KopBuH91 »

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

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





Код:

Код: Выделить всё

;~ #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
Аватара пользователя
KopBuH91

Re: [решено] Версия WinVer.exe и создание переменной

Сообщение KopBuH91 »

Цитата madmasles:



как будут называться новые переменные
[решено] Версия WinVer.exe и создание переменной




Если есть нужный параметр?
Аватара пользователя
madmasles

Re: [решено] Версия WinVer.exe и создание переменной

Сообщение madmasles »

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

а так всё тоже самое. результатом будет таже самая запись в реестр.
Ответить

Вернуться в «AutoIt»