-
AutoIt
(
http://forum.oszone.net/forumdisplay.php?f=103)
Поиск файла на компьютере
Не знаю, возможно ли это но всё таки...
Возможно ли такое чтобы скрипт провёл поиск на компьютере оперделённого файла?
Например нужно найти вот такой файл:
"\cstrike\cfg\config.cfg"
при чём, как вы видите две последних папки известны, а вот где лежит папка "cstrike" это нужно определить и получить весь путь к файлу "config.cfg"
Вот такая задача =/
|
Цитата 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
и поиск должен выдать только второй путь из этих двух
|
Цитата:
Цитата 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
|
Сразу после запуска скрипта вылетает вот такое окошечко

Что это может значить?
Операционная система Windows 7
Файл который нужно найти находится вот тут F:\Counter-Strike Source\cstrike\cfg\config.cfg
|
У меня так находит.
Код:
$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')
|
Там лишний слеш после $aDrives[$i].
|
Да, классно, вот только если результатов будет несколько, то при нахождении первого сразу поиск останавливается... Ну в общем для меня это может даже и не проблема будет.
Спасибо. Полезное тебе сообщение =)
Не стесняйтесь, выкладывайте ещё свои примеры. Админ, не отмечай пока решенной, пожалуйста.
Цитата:
Цитата Creat0R
Там лишний слеш после $aDrives[$i]. »
|
Да, вижу. Убрал - заработало. Вот только как теперь из этой таблицы вытащить значения? =)
|
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 убрать.
|
Можно ещё вот так, для надёжности (+ поиск только первого найденного файла):
Код:
#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
|
sashadeg,
Я в своем посте код подправил. Теперь все, что находит пишет в файл my.txt
|
madmasles, классно! У тебя именно то что мне нужно и было =)
Как говорится, "То что доХтор прописал" =)
|
sashadeg,
Давайте не будем каждый ответ отмечать как "Полезное сообщение". А то в одной теме 3 штуки - перебор.
|
Время: 07:55.
© OSzone.net 2001-