Что нового

[Файловая система] Сбор информации с .inf файлов

Talany

Знающий
Сообщения
136
Репутация
11
Здравствуйте профессионалы AutoIt!
К сожелению к таким не отношусь (только осваиваю)

У меня такая к вам просьба

В OS Win XP есть папка inf (C:/Windows/Inf) в ней лежат inf файлы (драйвера)

так вот мне нужен скрипт который найдет в каждом inf файле строчку или словосочетание

например :
%PCI\VEN_1022&DEV_7409.DeviceDesc%=amdbusdr_Inst, PCI\VEN_1022&DEV_7409
(может состоять из нескольких таких строчек, но с разными pci\ven_&dev_)
из этого выделит pci\ven_1022&dev_7409 и занесет в любой текстовый файл например 1.txt

В итоге файл 1.txt должен быть следующего садержания например:
pci\ven_1022&dev_7409=\полный путь к файлу например (C:/Windows/Inf/inf1.inf)\

Заранее благодарен.
 

axlwor

Скриптер
Сообщения
657
Репутация
147
Тогда осваивай примеры из хелпа для
1. FileFindFirstFile. И измени под себя
2. FileRead. Маленькая доработка под файлы из п.1
3. Хуже всего пойдет с StringRegExp, но думаю сейчас народ дойдет и напишет тебе шаблон

Update: :-[
Код:
#include <Array.au3>

Global $path = @WindowsDir&"/Inf"
Global $GlobalArr[1]

_FileSearch($path)
_ToFile("2.txt", _ArrayToString($GlobalArr, @CRLF))
MsgBox (0, "Exit", "Программа закончила выполнение!", 30)
Exit

;Скопирастено отсюда
;http://autoit-script.ru/index.php?topic=32.msg153#msg153
Func _FileSearch($SearchDir = "C:/Windows/Inf")
	; Переходим в каталог для поиска
    FileChangeDir($SearchDir) 
	; Инициализируем поиск
    Local $sHandle = FileFindFirstFile("*.inf")
    While 1
		; Если каталог пуст изначально
		; закрываем хэндл и прекращаем поиск
		If $sHandle = -1 Then
            FileClose($sHandle)
            ExitLoop
        EndIf
		
        $file = FileFindNextFile($sHandle)
		$err = @error
        $string = FileRead($file)
		stri($string, $file)
		
		; Если файлы закончились прекращаем поиск
		; закрываем файлы
        If $err Then
			FileClose($sHandle)
            ExitLoop
        EndIf
    WEnd
EndFunc

Func Stri ($str = "", $fName = "")
	;PCI\VEN_1002&DEV_95C0
	Local $pattern = ", (?i)(pci\\.*)[\n\r]?"
	$aA = StringRegExp ($str, $pattern, 3)
	If @error = 0 Then
		$Co = UBound($GlobalArr)
		ReDim $GlobalArr[$Co+UBound($aA)]
		For $i = 0 To UBound ($aA) - 1
			$GlobalArr[$Co+$i] = StringStripWS($aA[$i], 8) & "=/" & $path & "/" & $fName & "/"
		Next
	EndIf
EndFunc

Func _ToFile ($FileName, $str)
	$hnd = FileOpen(@ScriptDir&"/"&$FileName, 2)
	FileWrite ($hnd, $str)
	FileClose($hnd)
EndFunc


Сразу предупреждаю :blum:. шаблон в StringRegExp ловит вторую подстроку с PCI* до конца строки (вместе с ; комментариями)
%PCI\VEN_1022&DEV_7409.DeviceDesc%=amdbusdr_Inst, PCI\VEN_1022&DEV_7409 ; Фигня, фигня
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Talany
Попробуйте так, у меня работает и на Win XP, и на Win 7:
Код:
#RequireAdmin ;это для Win 7
#include <File.au3>
#include <Array.au3>

;$Time = TimerInit()
$sFolder = @WindowsDir & '\inf\'
$sFileResult = @ScriptDir & '\FromINF.txt'
$sWhatFind = 'PCI\VEN'
Dim $aFind[1]
$z = 0

$aInfFiles = _FileListToArray($sFolder, '*.inf', 1)
For $i = 1 To $aInfFiles[0]
	$hFile = FileOpen($sFolder & $aInfFiles[$i], 0)
	$sText = FileRead($hFile)
	FileClose($hFile)
	$aTextTemp = StringRegExp($sText, '(\Q' & $sWhatFind & '\E.*?)\.', 3)
	If IsArray($aTextTemp) Then
		$aTextTemp = _ArrayUnique($aTextTemp)
		For $j = 1 To $aTextTemp[0]
			$z += 1
			ReDim $aFind[$z + 1]
			$aFind[$z] = StringReplace(StringStripWS($aTextTemp[$j], 7), @TAB, '') & _
					' >>>> INF File: ' & $sFolder & $aInfFiles[$i]
			Sleep(1)
		Next
	EndIf
	Sleep(1)
Next
$aFind[0] = 'Найдено ' & UBound($aFind) - 1 & ' записей.'
;MsgBox(0, '', Round(TimerDiff($Time) / 1000, 2) & " секунд.")
;_ArrayDisplay($aFind)
_FileWriteFromArray($sFileResult, $aFind)
 
Автор
T

Talany

Знающий
Сообщения
136
Репутация
11
Благадарю madmasles! То что нужно!
 
Верх