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

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   AutoIt (http://forum.oszone.net/forumdisplay.php?f=103)
-   -   [решено] Поиск файла на компьютере (http://forum.oszone.net/showthread.php?t=165603)

sashadeg 29-01-2010 22:29 1333891

Поиск файла на компьютере
 
Не знаю, возможно ли это но всё таки...
Возможно ли такое чтобы скрипт провёл поиск на компьютере оперделённого файла?
Например нужно найти вот такой файл:
"\cstrike\cfg\config.cfg"
при чём, как вы видите две последних папки известны, а вот где лежит папка "cstrike" это нужно определить и получить весь путь к файлу "config.cfg"
Вот такая задача =/

Creat0R 29-01-2010 22:50 1333906

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

sashadeg 30-01-2010 08:14 1334042

Цитата Creat0R:
Код:

#include <Array.au3>

$begin1 = TimerInit()
$aReturn = _FileSearch(@WindowsDir, "*.ini")
$dif1 = TimerDiff($begin1)

_ArrayDisplay($aReturn, Round($dif1, 2))

Func _FileSearch($sPath, $sFileMask)
    Local $iPID, $sStdOutRead, $aRet

    $iPID = Run(@ComSpec & ' /C Dir "' & $sPath & '\' & $sFileMask & '" /S /B /A RASH', @SystemDir, @SW_HIDE, 6)

    While 1
        $sStdOutRead &= StdoutRead($iPID)
        If @error <> 0 Then ExitLoop
    WEnd

    $aRet = StringSplit(StringStripCR(StringStripWS($sStdOutRead, 3)), @LF)
    Return SetError(@error, 0, $aRet)
EndFunc

Как я понял, этот скрипт ищет все файлы .ini в папке Windows?
А что если я не знаю даже на каком из дисков лежит этот файл? Результатов может быть целая куча, но мне нужно только те что имеют в пути к файлу вот такой фрагмент \cstrike\cfg\config.cfg
Например,
Имеются 2 одинаковых файла на компе под именем config.cfg
c:\windows\system\config.cfg
d:\prog\cstrike\cfg\config.cfg

и поиск должен выдать только второй путь из этих двух

Creat0R 30-01-2010 12:18 1334130

Цитата:

Цитата sashadeg
А что если я не знаю даже на каком из дисков лежит этот файл? »

Тогда нужно перебирать все диски...

Цитата:

Цитата sashadeg
мне нужно только те что имеют в пути к файлу вот такой фрагмент \cstrike\cfg\config.cfg »

Можно например так:

Код:

#include <Array.au3>

$aDrives = DriveGetDrive("FIXED")

For $i = 1 To UBound($aDrives) - 1
    $aReturn = _FileSearch($aDrives[$i] & "\", "config.cfg", "\cstrike\cfg\")
    If IsArray($aReturn) Then _ArrayDisplay($aReturn)
Next

Func _FileSearch($sPath, $sFileMask, $sInPath = "")
    Local $iPID, $sStdOutRead, $sRet, $aRet

    $iPID
= Run(@ComSpec & ' /C Dir "' & $sPath & '\' & $sFileMask & '" /S /B /A RASH', @SystemDir, @SW_HIDE, 6)

    While 1
        $sStdOutRead = StdoutRead($iPID)
        If @error <> 0 Then ExitLoop

        If $sInPath <> "" And StringInStr($sStdOutRead, $sInPath) Then $sRet &= $sStdOutRead
    WEnd

    $aRet = StringSplit(StringStripCR(StringStripWS($sRet, 3)), @LF)
    Return SetError(@error, 0, $aRet)
EndFunc


sashadeg 30-01-2010 12:58 1334146

Сразу после запуска скрипта вылетает вот такое окошечко

Что это может значить?
Операционная система Windows 7
Файл который нужно найти находится вот тут F:\Counter-Strike Source\cstrike\cfg\config.cfg

madmasles 30-01-2010 13:33 1334182

У меня так находит.

Код:

$Drive = DriveGetDrive('ALL')
    For $i = 1 To $Drive[0]
        $aReturn = _FileSearch($Drive[$i], 'config.cfg')
        For $i2 = 1 To $aReturn[0]
            If StringInStr($aReturn[$i2], "\cstrike\cfg\") > 0 Then
                FileWrite("my.txt", $aReturn[$i2] & @CRLF)
            EndIf
        Next
    Next

MsgBox(0, "", "Поиск окончен." & @CRLF & "Результат в файле my.txt")
Func _FileSearch($sPath, $sFileMask)
    Local $iPID, $sStdOutRead, $aRet

    $iPID
= Run(@ComSpec & ' /C Dir "' & $sPath & '\' & $sFileMask & '" /S /B /A RASH', @SystemDir, @SW_HIDE, 6)

    While 1
        $sStdOutRead &= StdoutRead($iPID)
        If @error <> 0 Then ExitLoop
    WEnd


    $aRet = StringSplit(StringStripCR(StringStripWS($sStdOutRead, 3)), @LF)
    Return SetError(@error, 0, $aRet)
EndFunc

PS
Только, наверное, если диск всего один, ошибка будет. Мне проверить негде.

PPS
Не вылазит ошибка даже если диск всего один. Я удалил у себя виртуальный CDROM и указал
Код:

$Drive = DriveGetDrive('CDROM')

Creat0R 30-01-2010 14:03 1334213

Цитата:

Цитата sashadeg
Что это может значить? »

Там лишний слеш после $aDrives[$i].

sashadeg 30-01-2010 14:04 1334214

Цитата:

Цитата madmasles
У меня так находит. »

Да, классно, вот только если результатов будет несколько, то при нахождении первого сразу поиск останавливается... Ну в общем для меня это может даже и не проблема будет.
Спасибо. Полезное тебе сообщение =)

Не стесняйтесь, выкладывайте ещё свои примеры. Админ, не отмечай пока решенной, пожалуйста.

Цитата:

Цитата Creat0R
Там лишний слеш после $aDrives[$i]. »

Да, вижу. Убрал - заработало. Вот только как теперь из этой таблицы вытащить значения? =)

madmasles 30-01-2010 14:10 1334219

sashadeg,
Как я понял вариант должен быть единственным
Цитата:

Цитата sashadeg
Имеются 2 одинаковых файла на компе под именем config.cfg
c:\windows\system\config.cfg
d:\prog\cstrike\cfg\config.cfg
и поиск должен выдать только второй путь из этих двух »

sashadeg,
В моем варианте после или вместо MsgBox(...) можно, например, FileWrite("my.txt", $aReturn[$i2] & @CRLF) написать.

PS
Чтобы поиск не останавливался, надо Exit убрать.

Creat0R 30-01-2010 14:11 1334220

Можно ещё вот так, для надёжности (+ поиск только первого найденного файла):

Код:

#include <Array.au3>

$aDrives = DriveGetDrive("FIXED")

For $i = 1 To UBound($aDrives) - 1
    $sReturn = _FileSearch($aDrives[$i], "config.cfg", "\cstrike\cfg\")
    If Not @error Then Exit MsgBox(64, 'Title', $sReturn)
Next

Func _FileSearch($sPath, $sFileMask, $sInPath = "")
    Local $iLen, $iPID, $sStdOutRead, $sRet, $aRet

    $iLen
= StringLen($sInPath & $sFileMask)
    $iPID = Run(@ComSpec & ' /C Dir "' & $sPath & '\' & $sFileMask & '" /O:-D /S /B /A RASH', $sPath, @SW_HIDE, 6)

    While 1
        $sStdOutRead = StdoutRead($iPID)
        If @error <> 0 Then ExitLoop
        If $sStdOutRead = "" Then ContinueLoop

        If $sInPath <> "" And StringRight(StringStripWS($sStdOutRead, 2), $iLen) = $sInPath & $sFileMask Then
            StdinWrite($iPID)
            If ProcessExists($iPID) Then ProcessClose($iPID)
            Return $sStdOutRead
        EndIf
    WEnd

    Return SetError(1, 0, 0)
EndFunc

Цитата:

Цитата sashadeg
как теперь из этой таблицы вытащить значения? »

Код:

For $i = 1 To $aReturn[0]
      MsgBox(64, "", "Значение №" & $i & ": " & $aReturn[$i])
Next


madmasles 30-01-2010 14:32 1334239

sashadeg,
Я в своем посте код подправил. Теперь все, что находит пишет в файл my.txt

sashadeg 30-01-2010 18:22 1334405

madmasles, классно! У тебя именно то что мне нужно и было =)
Как говорится, "То что доХтор прописал" =)

madmasles 30-01-2010 18:40 1334417

sashadeg,
Давайте не будем каждый ответ отмечать как "Полезное сообщение". А то в одной теме 3 штуки - перебор.


Время: 07:55.

Время: 07:55.
© OSzone.net 2001-