Datei auf komplettem Rechner suchen und dann in das Verzeichnis dieser wechseln

  • Hallo Leute,

    programmiere gerade ein kleines Tool für unsere Kunden, mit dem ich Logdateien, welche beim Backup unserer Software erstellt werden, kopieren möchte.
    Da ich aber nicht weiß, wo die Kunden das Tool abgelegt haben, möchte ich gerne nach dem Dateinamen des Backup-Tools suchen (welcher sicher eindeutig ist) und dann als Arbeitsverzeichnis das jeweilige Verzeichnis setzen. Im Unterordner von dort liegen dann die Logdateien, welche ich an einen anderen Ort kopieren möchte (der Einfachheit halber nach C:\Backup).
    Kann mir einer sagen, wie ich nach der Datei suche? Hab es mit

    [autoit]

    RunWait(@ComSpec & ' /c dir ' & $file & ' / S', '', @SW_HIDE)

    [/autoit]


    versucht, aber da bekomme ich ja das Ergebnis immer auf den Bildschirm oder in eine Textdatei, ich möchte aber direkt den Pfad haben.

    Gruß
    Jass

  • Hallo Jass,

    Das komplette Dateisystem zu durchsuchen finde ich etwas umständlich.
    Steht der Backup-Pfad nicht irgendwo in der Registry?
    Oder wird er sonst wo gespeichert?

    Gruß

  • Dein Ansatz mit der Eingabeaufforderung war schon ganz gut.
    Man muss ihn nur ausbauen.
    Die Kommandozeilenfunktionen sind nämlich äußerst fix.
    Erst Recht schneller als die vorgeschlagene Objekt-Variante.

    Beispiel:

    Spoiler anzeigen
    [autoit]

    #include <Array.au3>

    [/autoit] [autoit][/autoit] [autoit]

    $aRet = FindFile("notepad.exe", "C:\")
    If Not @error Then _ArrayDisplay($aRet)

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    ; $sFileName : Suchname der Datei
    ; $sOrt : Suchort
    ; $bMulti : True = Alle Dateien werden gefunden, False= Abbruch der Suche nach erstem Fund
    Func FindFile(Const $sFileName, $sOrt, Const $bMulti = False)
    ;by AspirinJunkie
    Local $sLine, $iPID, $sReturn = ""
    $sOrt = FileGetLongName($sOrt)
    If @error Then Return SetError(1, 0, "")

    [/autoit] [autoit][/autoit] [autoit]

    $iPID = Run(@ComSpec & ' /c dir /S /B | find /i "' & $sFileName & '"', $sOrt, @SW_HIDE, 2)

    [/autoit] [autoit][/autoit] [autoit]

    Do
    $sLine = StdoutRead($iPID)
    If @extended > 0 Then
    $sReturn &= StringStripWS($sLine, 3) & '|'
    If Not $bMulti Then ExitLoop
    EndIf
    Until @error

    [/autoit] [autoit][/autoit] [autoit]

    If $sReturn = "" Then
    Local $aTmp[1] = [-1]
    Return SetError(2, 0, $aTmp)
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    Return StringSplit(StringTrimRight($sReturn, 1), "|")
    EndFunc ;==>FindFile

    [/autoit]
  • AspirinJunkie

    Sehr cool, hab mal einen Timer mitlaufen lassen, dadurch spare ich beim Durchsuchen von mehreren Laufwerken mehr als die Hälfte an Zeit!
    Allerdings stehe ich scheinbar noch auf einem riesengroßen Schlauch:

    [autoit]

    #include <Array.au3>

    [/autoit][autoit][/autoit][autoit]

    ; $sFileName : Suchname der Datei
    ; $sOrt : Suchort
    ; $bMulti : True = Alle Dateien werden gefunden, False= Abbruch der Suche nach erstem Fund
    Func FindFile(Const $sFileName, $sOrt, Const $bMulti = False)
    ;by AspirinJunkie
    Local $sLine, $iPID, $sReturn = ""
    $sOrt = FileGetLongName($sOrt)
    If @error Then Return SetError(1, 0, "")

    [/autoit][autoit][/autoit][autoit]

    $iPID = Run(@ComSpec & ' /c dir /S /B | find /i "' & $sFileName & '"', $sOrt, @SW_HIDE, 2)

    [/autoit][autoit][/autoit][autoit]

    Do
    $sLine = StdoutRead($iPID)
    If @extended > 0 Then
    $sReturn &= StringStripWS($sLine, 3) & '|'
    If Not $bMulti Then ExitLoop
    EndIf
    Until @error

    [/autoit][autoit][/autoit][autoit]

    If $sReturn = "" Then
    Local $aTmp[1] = [-1]
    Return SetError(2, 0, $aTmp)
    EndIf

    [/autoit][autoit][/autoit][autoit]

    Return StringSplit(StringTrimRight($sReturn, 1), "|")
    EndFunc ;==>FindFile

    [/autoit][autoit][/autoit][autoit]

    $var = DriveGetDrive( "fixed" )
    If NOT @error Then
    For $i = 1 to $var[0]
    $aRet = FindFile("mypersonalbackup.exe", $var[$i] & '\')
    ;If Not @error Then _ArrayDisplay($aRet)
    Next
    EndIf

    [/autoit]

    Wie kann ich es anstellen, dass ich auf den Wert von $aRet[1], also das Ergebnis mit dem Pfad der gesuchten Datei, auch außerhalb meiner If-Abfrage zugreifen kann?

  • Definiere einfach außerhalb eine Variable und übergib ihr den Wert.
    Bsp.:

    Spoiler anzeigen
    [autoit]

    Global $Pfad

    [/autoit] [autoit][/autoit] [autoit]

    $var = DriveGetDrive("fixed")
    If Not @error Then
    For $i = 1 To $var[0]
    $aRet = FindFile("mypersonalbackup.exe", $var[$i])
    If Not @error Then
    $Pfad = $aRet[1]
    ExitLoop
    EndIf
    Next
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    MsgBox(0,"Test", $Pfad)

    [/autoit]