Что нового

[Реестр] Поиск программ и путь к ним в реестре

ssvih

Новичок
Сообщения
35
Репутация
1
Ребята нуждаюсь в помощи!!!
В общем дело следующее, я сделал скрипт который запускает ряд программ и выполняет некоторые действия, у меня на компе он работает отлично, но вот когда я дал его в пользование то столкнулся с проблемой, что те-же самые программы у человека но находятся совсем в других папках, так вот нужно понять каким образом найти эти программы по названию в реестре, так же нужно вытащить от туда путь к программе и запустить её (их)
Будьте любезны помогите новичку!
 

sngr

AutoIT Гуру
Сообщения
1,010
Репутация
408
Код:
MsgBox(0,'',RegRead('HKEY_LOCAL_MACHINE\SOFTWARE\AutoIt v3\AutoIt','InstallDir'))
 
Автор
S

ssvih

Новичок
Сообщения
35
Репутация
1
Программа не установлена, просто лежит в папке на рабочем столе, есть запись в реестре!
Представленный способ оригинален но только для установленных программ!
Вот допустим я в реестре ищу "AutoClickerProject" на что получаю ответ, что да есть такая запись Тип reg_sz и путь к папке в имени (Параметр)
 

sngr

AutoIT Гуру
Сообщения
1,010
Репутация
408
Нет разницы между установленной или нет программой. Если есть запись в реестре с путём - считываешь этот путь.
 
Автор
S

ssvih

Новичок
Сообщения
35
Репутация
1
Я понял каким образом можно считать параметр?
Я знаю название проги в реестре название приходится "Значением" вот теперь вопрос зная значение как получить "Параметр" - путь к программе!?


Добавлено:
Сообщение автоматически объединено:

Вот скрин
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
ssvih,
ИМХО, проще на диске нужные файлы найти, записать пути в ини-файл и пользоваться потом им.
 
Автор
S

ssvih

Новичок
Сообщения
35
Репутация
1
Понятное дело что проще!
Это первая мысль которая посетила меня, но стоял и другой вопрос ) Вопрос профессиональности исполнения!
Хотя вот сижу сейчас и думаю, ведь можно действительно создать один файлик который найдет все это дело и запишет в ини как вы говорите а потом основной скрипт будет его юзать ) Не идеал конечно но как выход вполне подойдет если не найду прямого решения, пока что никаких результатов (
Не подскажете как реализовать ваше предложение?
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
ssvih [?]
Не подскажете как реализовать
_FileDirList

Можно так попробовать.
Код:
#include <Array.au3>

Opt('MustDeclareVars', 1)

Global $aMyProg[5][2] = [[4],['MyProg_1.exe'],['MyProg_2.exe'],['MyProg_3.exe'],['MyProg_4.exe']]

_GetPath($aMyProg)
_ArrayDisplay($aMyProg)


Func _GetPath(ByRef $a_MyProg)
	Local $s_FileMask, $a_Files, $s_IniFile = @ScriptDir & '\MyProg.ini'

	For $i = 1 To $a_MyProg[0][0]
		$a_MyProg[$i][1] = IniRead($s_IniFile, 'Path', $a_MyProg[$i][0], 'error')
		If $a_MyProg[$i][1] = 'error' Then
			$a_MyProg[$i][1] = ''
			$s_FileMask &= $a_MyProg[$i][0] & ';'
			ContinueLoop
		EndIf
		If Not FileExists($a_MyProg[$i][1]) Then
			$s_FileMask &= $a_MyProg[$i][0] & ';'
		EndIf
	Next
	If Not $s_FileMask Then Return
	$a_Files = _FileDirList('C:', $s_FileMask, 1);здесь поиск только на диске C:, но можно и на всех дисках искать
	$s_FileMask = ''
	If Not @error Then
		For $i = 1 To $a_Files[0]
			For $j = 1 To $a_MyProg[0][0]
				If StringRegExp($a_Files[$i], $a_MyProg[$j][0] & '$') Then
					$a_MyProg[$j][1] = $a_Files[$i]
					IniWrite($s_IniFile, 'Path', $a_MyProg[$j][0], $a_MyProg[$j][1])
					ExitLoop
				EndIf
			Next
		Next
	EndIf
	For $i = 1 To $a_MyProg[0][0]
		If Not $a_MyProg[$i][1] Then
			$s_FileMask &= $a_MyProg[$i][0] & ', '
		EndIf
	Next
	If Not $s_FileMask Then Return
	MsgBox(48, 'Attention', 'No File(s): ' & StringTrimRight($s_FileMask, 2))
EndFunc   ;==>_GetPath

Func _FileDirList($sPath, $sFileMask = "*", $iFlag = 0, $iSubDir = 1, $iSort = 0)
	;CreatoR; http://autoit-script.ru/index.php/topic,8266.msg55775
	Local $sOutBin, $sOut, $aOut, $aMasks, $sRead, $hDir, $sAttrib, $sFiles

	If Not StringInStr(FileGetAttrib($sPath), "D") Then
		Return SetError(1, 0, 0)
	EndIf
	If $iSubDir = 1 Then
		$sAttrib &= ' /S'
	EndIf
	If $iSort = 1 Then
		$sAttrib &= ' /O:N'
	EndIf
	Switch $iFlag
		Case 1
			$sAttrib &= ' /A-D'
		Case 2
			$sAttrib &= ' /AD'
		Case Else
			$sAttrib &= ' /A'
	EndSwitch
	$sOut = StringToBinary('0' & @CRLF, 2)
	$sPath = StringRegExpReplace($sPath, '\\+$', '')
	$sFileMask = StringRegExpReplace($sFileMask, '^;+|;+$', '')
	$sFileMask = StringRegExpReplace($sFileMask, ';{2,}', ';')
	$aMasks = StringSplit($sFileMask, ';')
	For $i = 1 To $aMasks[0]
		If StringStripWS($aMasks[$i], 8) = "" Then
			ContinueLoop
		EndIf
		$sFiles &= '"' & $sPath & '\' & $aMasks[$i] & '"'
		If $i < $aMasks[0] Then
			$sFiles &= ';'
		EndIf
	Next
	$hDir = Run(@ComSpec & ' /U /C DIR ' & $sFiles & ' /B' & $sAttrib, @SystemDir, @SW_HIDE, 6)
	While 1
		$sRead = StdoutRead($hDir, False, True)
		If @error Then
			ExitLoop
		EndIf
		If $sRead <> "" Then
			$sOut &= $sRead
		EndIf
		Sleep(2)
	WEnd
	$aOut = StringRegExp(BinaryToString($sOut, 2), '[^\r\n]+', 3)
	If @error Or UBound($aOut) < 2 Then
		Return SetError(2, 0, 0)
	EndIf
	$aOut[0] = UBound($aOut) - 1
	Return $aOut
EndFunc   ;==>_FileDirList
 

AZJIO

Меценат
Меценат
Сообщения
2,879
Репутация
1,194
ssvih
Макрос
Код:
@ProgramFilesDir
@DesktopDir


Программа не установлена, просто лежит в папке на рабочем столе, есть запись в реестре!Представленный способ оригинален но только для установленных программ!
К примеру у меня рабочий стол на диске D, а также несколько каталогов, чтобы не потерять личное при удалении Windows. Такой скрипт поиска будет пол-часа искать файлы. Можно ограничить поиск вышеуказанными каталогами или определится с программами, чтобы вычислить способ поиска в реестре или предоставить указать путь к программе, если она не найдена по стандартным путям.
 
Автор
S

ssvih

Новичок
Сообщения
35
Репутация
1
Решил попробовать сделать следующее, дла начала скрипт будет выполнять
1 - проверка файла в своём каталоге если есть inf.ini то скрипт продолжает работу если нет то поиск файлов по имени и собственно создание этого файла inf.ini
2 - выполнение скрипта то есть запуск программ

madmasles

Не подскажешь как сразу записать найденные программы в файл без вывода сообщения на экран?

Вот вид файла
Код:
$file = ("inf.ini")

If FileExists ($file) Then
MsgBox (0, "File:", "На месте")
Else 
MsgBox (0, "File:", "Нету")
EndIf
 

beliy

Продвинутый
Сообщения
372
Репутация
72
Как вариант, при первом запуске выводить диалоговое окно в котором пользователь укажет корректные пути. Результат записывается в ini и не спрашивается в дальнейшем. Это лучше чем искать по всем дискам...
 
Верх