Войти

Показать полную графическую версию : [решено] Поиск файла на компьютере


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

Creat0R
29-01-2010, 22:50
Прежде чем искать файл, следовало бы поискать решение на форуме (http://forum.oszone.net/forumdisplay.php?f=103&filter_string=%EF%EE%E8%F1%EA+%F4%E0%E9%EB&filter_by=title).

sashadeg
30-01-2010, 08:14
Цитата 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
А что если я не знаю даже на каком из дисков лежит этот файл? »
Тогда нужно перебирать все диски...

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

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

#include <Array.au3>

$aDrives = DriveGetDrive (http://www.autoitscript.com/autoit3/docs/functions/DriveGetDrive.htm)("FIXED")

For (http://www.autoitscript.com/autoit3/docs/keywords.htm#For) $i = 1 To (http://www.autoitscript.com/autoit3/docs/keywords.htm#To) UBound (http://www.autoitscript.com/autoit3/docs/functions/UBound.htm)($aDrives) - 1
$aReturn = _FileSearch($aDrives[$i] & "\", "config.cfg", "\cstrike\cfg\")
If (http://www.autoitscript.com/autoit3/docs/keywords.htm#If) IsArray (http://www.autoitscript.com/autoit3/docs/functions/IsArray.htm)($aReturn) Then (http://www.autoitscript.com/autoit3/docs/keywords.htm#Then) _ArrayDisplay($aReturn)
Next (http://www.autoitscript.com/autoit3/docs/keywords.htm#Next)

Func (http://www.autoitscript.com/autoit3/docs/keywords.htm#Func) _FileSearch($sPath, $sFileMask, $sInPath = "")
Local (http://www.autoitscript.com/autoit3/docs/keywords.htm#Local) $iPID, $sStdOutRead, $sRet, $aRet

$iPID = Run (http://www.autoitscript.com/autoit3/docs/functions/Run.htm)(@ComSpec (http://www.autoitscript.com/autoit3/docs/macros.htm#@ComSpec) & ' /C Dir "' & $sPath & '\' & $sFileMask & '" /S /B /A RASH', @SystemDir (http://www.autoitscript.com/autoit3/docs/macros.htm#@SystemDir), @SW_HIDE (http://www.autoitscript.com/autoit3/docs/macros.htm#@SW_HIDE), 6)

While (http://www.autoitscript.com/autoit3/docs/keywords.htm#While) 1
$sStdOutRead = StdoutRead (http://www.autoitscript.com/autoit3/docs/functions/StdoutRead.htm)($iPID)
If (http://www.autoitscript.com/autoit3/docs/keywords.htm#If) @error (http://www.autoitscript.com/autoit3/docs/macros.htm#@error) <> 0 Then (http://www.autoitscript.com/autoit3/docs/keywords.htm#Then) ExitLoop (http://www.autoitscript.com/autoit3/docs/keywords.htm#ExitLoop)

If (http://www.autoitscript.com/autoit3/docs/keywords.htm#If) $sInPath <> "" And (http://www.autoitscript.com/autoit3/docs/keywords.htm#And) StringInStr (http://www.autoitscript.com/autoit3/docs/functions/StringInStr.htm)($sStdOutRead, $sInPath) Then (http://www.autoitscript.com/autoit3/docs/keywords.htm#Then) $sRet &= $sStdOutRead
WEnd (http://www.autoitscript.com/autoit3/docs/keywords.htm#WEnd)

$aRet = StringSplit (http://www.autoitscript.com/autoit3/docs/functions/StringSplit.htm)(StringStripCR (http://www.autoitscript.com/autoit3/docs/functions/StringStripCR.htm)(StringStripWS (http://www.autoitscript.com/autoit3/docs/functions/StringStripWS.htm)($sRet, 3)), @LF (http://www.autoitscript.com/autoit3/docs/macros.htm#@LF))
Return (http://www.autoitscript.com/autoit3/docs/keywords.htm#Return) SetError (http://www.autoitscript.com/autoit3/docs/functions/SetError.htm)(@error (http://www.autoitscript.com/autoit3/docs/macros.htm#@error), 0, $aRet)
EndFunc (http://www.autoitscript.com/autoit3/docs/keywords.htm#EndFunc)

sashadeg
30-01-2010, 12:58
Сразу после запуска скрипта вылетает вот такое окошечко
http://s001.radikal.ru/i194/1001/6f/5ce7f223309bt.jpg (http://s001.radikal.ru/i194/1001/6f/5ce7f223309b.jpg)
Что это может значить?
Операционная система Windows 7
Файл который нужно найти находится вот тут F:\Counter-Strike Source\cstrike\cfg\config.cfg

madmasles
30-01-2010, 13:33
У меня так находит.

$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
Что это может значить? »
Там лишний слеш после $aDrives[$i].

sashadeg
30-01-2010, 14:04
У меня так находит. »
Да, классно, вот только если результатов будет несколько, то при нахождении первого сразу поиск останавливается... Ну в общем для меня это может даже и не проблема будет.
Спасибо. Полезное тебе сообщение =)

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

Там лишний слеш после $aDrives[$i]. »
Да, вижу. Убрал - заработало. Вот только как теперь из этой таблицы вытащить значения? =)

madmasles
30-01-2010, 14:10
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
Можно ещё вот так, для надёжности (+ поиск только первого найденного файла):

#include <Array.au3>

$aDrives = DriveGetDrive (http://www.autoitscript.com/autoit3/docs/functions/DriveGetDrive.htm)("FIXED")

For (http://www.autoitscript.com/autoit3/docs/keywords.htm#For) $i = 1 To (http://www.autoitscript.com/autoit3/docs/keywords.htm#To) UBound (http://www.autoitscript.com/autoit3/docs/functions/UBound.htm)($aDrives) - 1
$sReturn = _FileSearch($aDrives[$i], "config.cfg", "\cstrike\cfg\")
If (http://www.autoitscript.com/autoit3/docs/keywords.htm#If) Not (http://www.autoitscript.com/autoit3/docs/keywords.htm#Not) @error (http://www.autoitscript.com/autoit3/docs/macros.htm#@error) Then (http://www.autoitscript.com/autoit3/docs/keywords.htm#Then) Exit (http://www.autoitscript.com/autoit3/docs/keywords.htm#Exit) MsgBox (http://www.autoitscript.com/autoit3/docs/functions/MsgBox.htm)(64, 'Title', $sReturn)
Next (http://www.autoitscript.com/autoit3/docs/keywords.htm#Next)

Func (http://www.autoitscript.com/autoit3/docs/keywords.htm#Func) _FileSearch($sPath, $sFileMask, $sInPath = "")
Local (http://www.autoitscript.com/autoit3/docs/keywords.htm#Local) $iLen, $iPID, $sStdOutRead, $sRet, $aRet

$iLen = StringLen (http://www.autoitscript.com/autoit3/docs/functions/StringLen.htm)($sInPath & $sFileMask)
$iPID = Run (http://www.autoitscript.com/autoit3/docs/functions/Run.htm)(@ComSpec (http://www.autoitscript.com/autoit3/docs/macros.htm#@ComSpec) & ' /C Dir "' & $sPath & '\' & $sFileMask & '" /O:-D /S /B /A RASH', $sPath, @SW_HIDE (http://www.autoitscript.com/autoit3/docs/macros.htm#@SW_HIDE), 6)

While (http://www.autoitscript.com/autoit3/docs/keywords.htm#While) 1
$sStdOutRead = StdoutRead (http://www.autoitscript.com/autoit3/docs/functions/StdoutRead.htm)($iPID)
If (http://www.autoitscript.com/autoit3/docs/keywords.htm#If) @error (http://www.autoitscript.com/autoit3/docs/macros.htm#@error) <> 0 Then (http://www.autoitscript.com/autoit3/docs/keywords.htm#Then) ExitLoop (http://www.autoitscript.com/autoit3/docs/keywords.htm#ExitLoop)
If (http://www.autoitscript.com/autoit3/docs/keywords.htm#If) $sStdOutRead = "" Then (http://www.autoitscript.com/autoit3/docs/keywords.htm#Then) ContinueLoop (http://www.autoitscript.com/autoit3/docs/keywords.htm#ContinueLoop)

If (http://www.autoitscript.com/autoit3/docs/keywords.htm#If) $sInPath <> "" And (http://www.autoitscript.com/autoit3/docs/keywords.htm#And) StringRight (http://www.autoitscript.com/autoit3/docs/functions/StringRight.htm)(StringStripWS (http://www.autoitscript.com/autoit3/docs/functions/StringStripWS.htm)($sStdOutRead, 2), $iLen) = $sInPath & $sFileMask Then (http://www.autoitscript.com/autoit3/docs/keywords.htm#Then)
StdinWrite (http://www.autoitscript.com/autoit3/docs/functions/StdinWrite.htm)($iPID)
If (http://www.autoitscript.com/autoit3/docs/keywords.htm#If) ProcessExists (http://www.autoitscript.com/autoit3/docs/functions/ProcessExists.htm)($iPID) Then (http://www.autoitscript.com/autoit3/docs/keywords.htm#Then) ProcessClose (http://www.autoitscript.com/autoit3/docs/functions/ProcessClose.htm)($iPID)
Return (http://www.autoitscript.com/autoit3/docs/keywords.htm#Return) $sStdOutRead
EndIf (http://www.autoitscript.com/autoit3/docs/keywords.htm#EndIf)
WEnd (http://www.autoitscript.com/autoit3/docs/keywords.htm#WEnd)

Return (http://www.autoitscript.com/autoit3/docs/keywords.htm#Return) SetError (http://www.autoitscript.com/autoit3/docs/functions/SetError.htm)(1, 0, 0)
EndFunc (http://www.autoitscript.com/autoit3/docs/keywords.htm#EndFunc)

как теперь из этой таблицы вытащить значения? »
For $i = 1 To $aReturn[0]
MsgBox(64, "", "Значение №" & $i & ": " & $aReturn[$i])
Next

madmasles
30-01-2010, 14:32
sashadeg,
Я в своем посте код подправил. Теперь все, что находит пишет в файл my.txt

sashadeg
30-01-2010, 18:22
madmasles, классно! У тебя именно то что мне нужно и было =)
Как говорится, "То что доХтор прописал" =)

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




© OSzone.net 2001-2012