Что нового

[Автоматизация] Как добавить переменную среду?

Mancoffee

Свет проталкивает тьму ...
Сообщения
86
Репутация
1
Интересует, как добавить пользовательскую и системную. И как перед этим проверить, есть уже такая или нет? Если существует, то как заменить и как пропустить?
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
626
Код:
EnvGet
EnvSet
 
Автор
Mancoffee

Mancoffee

Свет проталкивает тьму ...
Сообщения
86
Репутация
1
А как называются системная переменная и пользовательская? (например есть переменная: path), а эти как называются?
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
http://autoit-script.ru/index.php/topic,10424.msg69036.html#msg69036
 
Автор
Mancoffee

Mancoffee

Свет проталкивает тьму ...
Сообщения
86
Репутация
1
Как сделать проверку? Хочу, чтобы скрипт проверил все переменные (системные и пользовательские) на наличие напимер "D:\Total".
На примере Path я сделал так
Код:
$reg = RegRead("HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment", "path")
   MsgBox(4096, "Значения:", $reg)
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Mancoffee [?]
Как сделать проверку? Хочу, чтобы скрипт проверил все переменные (системные и пользовательские) на наличие напимер "D:\Total".

Код:
#include <Array.au3>

$aKey = _RegSearch("HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment", "D:\Total", 2)
_ArrayDisplay($aKey)

;[0] = Instance
;[1] = Key
;[2] = Full Value (if $i_Mode = 2)
Func _RegSearch($s_Key, $s_Search, $i_Mode = 0, $i_Partial = 1, $i_Case = 0)
	Local $i = 1, $sKey, $sVal, $aRet[3]
	
	While 1
		Switch $i_Mode
			Case 0 ;Search in Keys
				$sKey = RegEnumKey($s_Key, $i)
				If @error <> 0 Then ExitLoop
				
				If ($i_Partial And StringInStr($sKey, $s_Search, $i_Case)) Or (Not $i_Partial And $sKey = $s_Search) Then
					$aRet[0] = $i
					$aRet[1] = $sKey
					
					Return $aRet
				EndIf
			Case 1, 2 ;Search in SubKeys, Search in SubKeys Value
				$sVal = RegEnumVal($s_Key, $i)
				If @error <> 0 Then ExitLoop
				
				$aRet[0] = $i
				$aRet[1] = $sVal
				
				If $i_Mode = 2 Then
					$sVal = RegRead($s_Key, $sVal)
					$aRet[2] = $sVal
				EndIf
				
				If ($i_Partial And StringInStr($sVal, $s_Search, $i_Case)) Or (Not $i_Partial And $sVal = $s_Search) Then
					Return $aRet
				EndIf
		EndSwitch
		
		$i += 1
	WEnd
	
	Return SetError(1, 0, 0)
EndFunc
 
Автор
Mancoffee

Mancoffee

Свет проталкивает тьму ...
Сообщения
86
Репутация
1
CreatoR
Скрипт выполняется без ошибок, только не понятно мне, :stars: где мне поставить вывод сообщений для информации (есть или нет определённая переменная и значение)?

P.S. Сложноватый для меня "чайника" такой скрипт.
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Mancoffee [?]
где мне поставить вывод сообщений для информации (есть или нет определённая переменная и значение)?

Код:
$aKey = _RegSearch("HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment", "D:\Total", 2)

If @error Then
    MsgBox(0, '', 'Нет переменной с таким значением')
Else
    MsgBox(0, '', 'Есть переменная с таким значением')
    _ArrayDisplay($aKey)
EndIf
 
Автор
Mancoffee

Mancoffee

Свет проталкивает тьму ...
Сообщения
86
Репутация
1
CreatoR
У меня есть переменные (вместо значения "D:\Total" я задал реальную переменную для поиска - "Total"):
Total = d:\Programs\System\Total Commander\v8.0 (x64-x86)
Firefox = d:\Programs\System\Total Commander\v8.0 (x64-x86)\Soft\FireFox\App\Firefox
При выполнении скрипта выводится такое окно


при закрытии появляется окно о том, что переменная присутствует, потом опять первое окно. У меня она и local и current. Из-за этого два раза и показывается (насколько я понял), но нет признаков, какая она (т.е. local или current). Как определить в скрипте для отображения?
А про наличие переменной "Total" ни "звука".

И как задать несколько переменных для поиска и если нет, то как потом добавить? (Не знаю куда в твоём скрипте поставить EnvSet)
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Mancoffee
Я не уверен что понял, выложи скрипт с которым работаешь, ну или хотя бы ту часть где используется поиск.
 
Автор
Mancoffee

Mancoffee

Свет проталкивает тьму ...
Сообщения
86
Репутация
1
CreatoR
Код:
#include <Array.au3>

$aKey = _RegSearch("HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment", "Total", 2)
_ArrayDisplay($aKey)

If @error Then
    MsgBox(0, '', 'Нет переменной с таким значением')
Else
    MsgBox(0, '', 'Есть переменная с таким значением')
    _ArrayDisplay($aKey)
EndIf

;[0] = Instance
;[1] = Key
;[2] = Full Value (if $i_Mode = 2)
Func _RegSearch($s_Key, $s_Search, $i_Mode = 0, $i_Partial = 1, $i_Case = 0)
    Local $i = 1, $sKey, $sVal, $aRet[3]
   
    While 1
        Switch $i_Mode
            Case 0 ;Search in Keys
                $sKey = RegEnumKey($s_Key, $i)
                If @error <> 0 Then ExitLoop
               
                If ($i_Partial And StringInStr($sKey, $s_Search, $i_Case)) Or (Not $i_Partial And $sKey = $s_Search) Then
                    $aRet[0] = $i
                    $aRet[1] = $sKey
                   
                    Return $aRet
                EndIf
            Case 1, 2 ;Search in SubKeys, Search in SubKeys Value
                $sVal = RegEnumVal($s_Key, $i)
                If @error <> 0 Then ExitLoop
               
                $aRet[0] = $i
                $aRet[1] = $sVal
               
                If $i_Mode = 2 Then
                    $sVal = RegRead($s_Key, $sVal)
                    $aRet[2] = $sVal
                EndIf
               
                If ($i_Partial And StringInStr($sVal, $s_Search, $i_Case)) Or (Not $i_Partial And $sVal = $s_Search) Then
                    Return $aRet
                EndIf
        EndSwitch
       
        $i += 1
    WEnd
   
    Return SetError(1, 0, 0)
EndFunc

Хотел уточнить. Как задать для поиска несколько и переменных и несколько значений.
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Вот поправил:

Код:
#include <Array.au3>

Dim $aSearch[2] = ["Total", "Firefox"]

For $sSearch_Str In $aSearch
	$aKey = _RegSearch("HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment", $sSearch_Str, 2)
	
	If Not @error Then
		_ArrayDisplay($aKey)
	EndIf
Next

;[0][0] = Total items found
;[N][0] = Key
;[N][1] = Full Value (if $i_Mode = 2)
Func _RegSearch($s_Key, $s_Search, $i_Mode = 0, $i_Partial = 1, $i_Case = 0, $i_RetFirstPos = 0)
    Local $i = 1, $sKey, $sSubKey, $sVal, $aRet[1][1]
   
    While 1
        Switch $i_Mode
            Case 0 ;Search in Keys
                $sKey = RegEnumKey($s_Key, $i)
                If @error <> 0 Then ExitLoop
				
                If ($i_Partial And StringInStr($sKey, $s_Search, $i_Case)) Or (Not $i_Partial And $sKey = $s_Search) Then
                    $aRet[0][0] += 1
					ReDim $aRet[$aRet[0][0]+1][2]
					
					$aRet[$aRet[0][0]][0] = $sKey
                   
					If $i_RetFirstPos Then
						Return $aRet
					EndIf
                EndIf
            Case 1, 2 ;Search in SubKeys, Search in SubKeys Value
                $sSubKey = RegEnumVal($s_Key, $i)
                If @error <> 0 Then ExitLoop
				
				$sVal = $sSubKey
				
                If $i_Mode = 2 Then
                    $sVal = RegRead($s_Key, $sSubKey)
                EndIf
               
                If ($i_Partial And StringInStr($sVal, $s_Search, $i_Case)) Or (Not $i_Partial And $sVal = $s_Search) Then
					If $i_Mode <> 2 Then $sVal = ''
					
					$aRet[0][0] += 1
					ReDim $aRet[$aRet[0][0]+1][2]
					
					$aRet[$aRet[0][0]][0] = $sSubKey
					$aRet[$aRet[0][0]][1] = $sVal
					
					If $i_RetFirstPos Then
						Return $aRet
					EndIf
                EndIf
        EndSwitch
       
        $i += 1
    WEnd
	
	If $aRet[0][0] > 0 Then
		Return $aRet
	EndIf
	
    Return SetError(1, 0, 0)
EndFunc


Ищет указанные в массиве $aSearch строки, в

Пример делится на две части.

1. Сама функция (всё что между Func и EndFunc), она выполняет поиск в реестре.
- Поддерживает параметры:
$s_Key - Путь реестра (имя раздела) в котором будет выполнен поиск.
$s_Search - Строка поиска.
$i_Mode - Режим поиска: 0 (по умолчанию) -> поиск в ключах (подменю в разделе), 1 -> поиск в имени ключей, 2 -> поиск в значениях ключей.
$i_Partial - Определяет частичность поиска: 0 -> поиск как «слово целиком», 1 (по умолчанию) -> частичное совпадение.
$i_Case - Определяет регистрозависимый поиск: 0 (по умолчанию) -> поиск без учёта регистра букв, 1 -> поиск с учётом регистра букв.
$i_RetFirstPos - Определяет возвращаемое значение: 0 (по умолчанию) -> возвращать все найденные совпадения в массиве, 1 -> возвращать только первое найденное совпадение.

- Возвращает двумерный массив, где...
Код:
[0][0] ;Число найденных ключей (переменных в данном случае).
[N][0] ;Ключ в котором найдена строка.
[N][1] ;Собственно вся строка в которой найдено совпадение.


2. Собственно тело скрипта:
- Сперва задаём массив искомых строк, в нашем случае содержит два элемента (ячейки): [0] = "Total", и [1] = "Firefox".
- Далее проходим по массиву и вызываем нашу функцию поиска с нужными параметрами (где $sSearch_Str это текущая ячейка в массиве, т.е первый раз это «Total», и второй соответственно «Firefox»).
- Если имеется совпадение (проверка «If Not @error Then ...»), выводим результат поиска (_ArrayDisplay, которая отображает массив найденных совпадении).
 
Автор
Mancoffee

Mancoffee

Свет проталкивает тьму ...
Сообщения
86
Репутация
1
CreatoR

А как насчёт, чтобы указывались переменные, то есть где Local, а где Current?
И этот скрипт только проверяет. Как, чтобы был запрос, если переменная отсутствует, то выдавало запрос на создание тех переменных, которые я проверяю?

И немного непонятно:
в поиске задал, как и у тебя в скрипте "Total и Firefox"
при выполнении в первом окне появляются 4-е переменные "Opera,Firefox,Total и Path" (со словом "Total" у меня три переменные "Opera,Firefox и Total"). Значения Opera и Firefox находяться ещё в "Path" (в пути которых есть слово "Total"), а во втором окне "Firefox и Path". За что отвечает первое окно и за что второе?
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Mancoffee [?]
А как насчёт, чтобы указывались переменные, то есть где Local, а где Current?
Пользовательские переменные в реестре находятся по следующему пути: HKCU\Environment
Системные переменные в реестре находятся по следующему пути: HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment

И этот скрипт только проверяет. Как, чтобы был запрос, если переменная отсутствует, то выдавало запрос на создание тех переменных, которые я проверяю?
Проверяй @error, если он больше 0-ля тогда переменная не найдена, соответственно выводи запрос (можно через InputBox) и создавай переменную (см. RegWrite в справке, хотя я уже дал выше ссылку по которой этот вопрос решён).

За что отвечает первое окно и за что второе?
:blink:
Первое за первую попытку поиска (Total), второе соответственно за вторую попытку (Firefox).


P.S.
У тебя в данной теме больше чем достаточно информации чтобы решить свою задачу, читай справку/форум и всё будет нормально.
 
Автор
Mancoffee

Mancoffee

Свет проталкивает тьму ...
Сообщения
86
Репутация
1
CreatoR
Ладно, Спасибо! :smile:
Буду бороться! :smile:
 
Верх