Ordner in Laufwerk suchen...

    • Offizieller Beitrag

    Hallo,

    der Unterschied zwischen den Funktionen von AspirinJunkie und mir ist, wenn AspirinJunkie nach einem Verzeichnis sucht sagen wir mal alle Temp-Verzeichnisse auf C:\, lautete bei ihm der Befehl:

    Code
    DIR temp /S /A:D /B; als Arbeitsverzeichnis C:\ angeben

    Das hat den Nachteile das das aktuelle Verz. (C:\) nicht durchsucht wird.

    Bei mir lautet der Befehl:

    Code
    DIR * /S /A:D /B; als Arbeitsverzeichnis C:\ angeben

    Das gibt alle Verzeichnisse von C:\ zurück, danach filter ich mit StringRegExp alle gesuchten Verzeichnisse raus.

    Der Nachteil bei miener Version ist das sie etwas länger dauert!

    Edit:

    Ich habe die Funktion noch etwas überarbeitet. Jetzt muss man der Funktion ein Array übergeben, dafür kann man aber gleich mehrer Verzeichnisse mit Startverzeichnis übergeben. Eine Funktion zum Dateisuchen habe ich auch noch hinzugepackt.

    Spoiler anzeigen
    [autoit]

    #include <Constants.au3>
    #include <Array.au3>

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

    Local $aszDirSearch[3][2] = [ [ "Temp", "C:\" ], _
    [ "Temp", "D:\" ], _
    [ "Tools", "D:\" ] _
    ]

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

    Local $aszFileSearch[2][2] = [ [ "*.au3", "C:\" ], _
    [ "*.au3", "D:\" ] _
    ]

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

    $Ordner = _DirSearch($aszDirSearch)
    _ArrayDisplay($Ordner, "Ausgabe")

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

    $Files = _FileSearch($aszFileSearch)
    _ArrayDisplay($Files, "Ausgabe")

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

    ; =================================================================================================
    ; Function Name: _DirSearch()
    ; Description: Sucht Verzeichnisse rekursiv in angegebenen Verzeichnissen
    ; Parameter(s): $aszSuche = Array mit folgendem Inhalt
    ; $aszSuche[n][0] = Verzeichnisname nach dem gesucht werden soll
    ; $aszSuche[n][0] = Startverzeichnis in dem gesucht werden soll
    ; $iBase = Startindex für $aszSuche (Vorgabe = 0)
    ; Return Value(s): Erfolg: (@error = 0) -> Array mit den Pfaden zu den gefundenen Ordnern zurück
    ; Array[0] = 0 -> keine Ordern gefunden
    ;
    ; Fehler: @error = 1 -> $aszSuche ist kein Array
    ; @error = 2 -> $aszSuche ist kein 2-Dimensioales Array
    ; @error = 3 -> $aszSuche enthält eine Leerstring
    ;==================================================================================================
    Func _DirSearch($aszSuche, $iBase = 0)
    Local $szStOut = ""
    Local $aResult[1] = [0]
    Local $aszWD[1]
    Local $aszPattern[1][2]

    If IsArray($aszSuche) Then
    If UBound($aszSuche,0) <> 2 Then Return SetError(2,0,$aResult)
    ReDim $aszPattern[UBound($aszSuche)][2]
    $aszWD[0] = ""
    For $cIndex = $iBase To UBound($aszSuche) - 1
    If (StringLen($aszSuche[$cIndex][0]) = 0) Or (StringLen($aszSuche[$cIndex][1]) = 0) Then SetError(3,0,$aResult)
    If Not StringInStr($aszWD[0],StringLeft($aszSuche[$cIndex][1],2)) Then $aszWD[0] &= StringLeft($aszSuche[$cIndex][1],2)
    If StringLeft($aszSuche[$cIndex][0],1) <> "\" Then $aszSuche[$cIndex][0] = "\" & $aszSuche[$cIndex][0]
    $aszPattern[$cIndex][0] = _StringToPattern($aszSuche[$cIndex][0])
    If StringRight($aszSuche[$cIndex][1],1) = "\" Then $aszSuche[$cIndex][1] = StringTrimRight($aszSuche[$cIndex][1],1)
    $aszPattern[$cIndex][1] = _StringToPattern($aszSuche[$cIndex][1])
    Next
    $cWDLen = StringLen($aszWD[0])
    if $cWDLen > 2 Then
    ReDim $aszWD[$cWDLen / 2]
    For $cIndex = $cWDLen - 1 To 1 Step -2
    $aszWD[Floor($cIndex / 2)] = StringMid($aszWD[0],$cIndex,2)
    Next
    EndIf
    Else
    SetError(1,0,$aResult)
    EndIf

    For $cIndex = 0 To UBound($aszWD) - 1
    $PID = Run(@ComSpec & " /c DIR * /A:D /B /S", $aszWD[$cIndex] & "\", @SW_HIDE, $STDOUT_CHILD)

    While 1
    $szStOut &= StdoutRead($PID)
    If @error Then ExitLoop
    WEnd
    Next
    $szStOut = StringSplit(OemToChar($szStOut), @CRLF, 1)

    For $cZeile = 1 To $szStOut[0]
    For $cIndex = 0 To UBound($aszPattern) - 1
    If StringRegExp($szStOut[$cZeile],"(?i)^(" & $aszPattern[$cIndex][1] & ".*" & $aszPattern[$cIndex][0] & ")$") Then
    if UBound($aResult) <= ($aResult[0] + 1) Then ReDim $aResult[UBound($aResult) + 100]
    $aResult[0] += 1
    $aResult[$aResult[0]] = $szStOut[$cZeile]
    EndIf
    Next
    Next
    ReDim $aResult[$aResult[0]+1]

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

    Return SetError(0,0,$aResult)
    EndFunc ;==>_DirSearch

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

    ; =================================================================================================
    ; Function Name: _FileSearch()
    ; Description: Sucht Dateien rekursiv in angegebenen Verzeichnissen
    ; Parameter(s): $aszSuche = Array mit folgendem Inhalt
    ; $aszSuche[n][0] = Dateiname nach dem gesucht werden soll
    ; $aszSuche[n][0] = Startverzeichnis in dem gesucht werden soll
    ; $iBase = Startindex für $aszSuche (Vorgabe = 0)
    ; Return Value(s): Erfolg: (@error = 0) -> Array mit den Pfaden zu den gefundenen Dateien zurück
    ; Array[0] = 0 -> keine Datei gefunden
    ;
    ; Fehler: @error = 1 -> $aszSuche ist kein Array
    ; @error = 2 -> $aszSuche ist kein 2-Dimensioales Array
    ; @error = 3 -> $aszSuche enthält eine Leerstring
    ;==================================================================================================
    Func _FileSearch($aszSuche, $iBase = 0)
    Local $szStOut = ""
    Local $aResult[1] = [0]
    Local $aszWD[1]
    Local $aszPattern[1][2]

    If IsArray($aszSuche) Then
    If UBound($aszSuche,0) <> 2 Then Return SetError(2,0,$aResult)
    ReDim $aszPattern[UBound($aszSuche)][2]
    $aszWD[0] = ""
    For $cIndex = $iBase To UBound($aszSuche) - 1
    If (StringLen($aszSuche[$cIndex][0]) = 0) Or (StringLen($aszSuche[$cIndex][1]) = 0) Then SetError(3,0,$aResult)
    If Not StringInStr($aszWD[0],StringLeft($aszSuche[$cIndex][1],2)) Then $aszWD[0] &= StringLeft($aszSuche[$cIndex][1],2)
    If StringLeft($aszSuche[$cIndex][0],1) <> "\" Then $aszSuche[$cIndex][0] = "\" & $aszSuche[$cIndex][0]
    $aszPattern[$cIndex][0] = _StringToPattern($aszSuche[$cIndex][0])
    If StringRight($aszSuche[$cIndex][1],1) = "\" Then $aszSuche[$cIndex][1] = StringTrimRight($aszSuche[$cIndex][1],1)
    $aszPattern[$cIndex][1] = _StringToPattern($aszSuche[$cIndex][1])
    Next
    $cWDLen = StringLen($aszWD[0])
    if $cWDLen > 2 Then
    ReDim $aszWD[$cWDLen / 2]
    For $cIndex = $cWDLen - 1 To 1 Step -2
    $aszWD[Floor($cIndex / 2)] = StringMid($aszWD[0],$cIndex,2)
    Next
    EndIf
    Else
    SetError(1,0,$aResult)
    EndIf

    For $cIndex = 0 To UBound($aszWD) - 1
    $PID = Run(@ComSpec & " /c DIR * /A:-D /B /S", $aszWD[$cIndex] & "\", @SW_HIDE, $STDOUT_CHILD)

    While 1
    $szStOut &= StdoutRead($PID)
    If @error Then ExitLoop
    WEnd
    Next
    $szStOut = StringSplit(OemToChar($szStOut), @CRLF, 1)

    For $cZeile = 1 To $szStOut[0]
    For $cIndex = 0 To UBound($aszPattern) - 1
    If StringRegExp($szStOut[$cZeile],"(?i)^(" & $aszPattern[$cIndex][1] & ".*" & $aszPattern[$cIndex][0] & ")$") Then
    if UBound($aResult) <= ($aResult[0] + 1) Then ReDim $aResult[UBound($aResult) + 100]
    $aResult[0] += 1
    $aResult[$aResult[0]] = $szStOut[$cZeile]
    EndIf
    Next
    Next
    ReDim $aResult[$aResult[0]+1]

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

    Return SetError(0,0,$aResult)
    EndFunc ;==>_FileSearch

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

    ;=======================================================================================


    ;===============================================================================
    ; Name: OemToChar
    ; Description: Wandelt einen ASCII- in einen ANSI-String
    ; Parameter(s): $szSrc = String der umgewandelt werden soll
    ; Requirement(s): keine
    ; Return Value(s): bei Erfolg: umgewandelter String
    ; bei Fehler: "" und @error = 1
    ; Author(s): bernd670
    ;===============================================================================
    Func OemToChar($szSrc)
    ;~ Private Declare Function OemToChar Lib "user32.dll" Alias "OemToCharA" (ByVal lpszSrc As String, ByVal lpszDst As String) As Long

    Local $strSrc = DllStructCreate("char[" & StringLen($szSrc) + 1 & "]")
    Local $strDst = DllStructCreate("char[" & StringLen($szSrc) * 2 + 1 & "]")
    DllStructSetData($strSrc,1,$szSrc)
    DllStructSetData($strDst,1,0)

    Local $lRetVal = DllCall("user32.dll", "long", "OemToChar", "ptr", DllStructGetPtr($strSrc), "ptr", DllStructGetPtr($strDst))
    If IsArray($lRetVal) And $lRetVal[0] = 1 Then
    Return SetError(0,0,DllStructGetData($strDst,1))
    EndIf

    Return SetError(1,0,"")
    EndFunc ;==>OemToChar

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

    ;===============================================================================
    ; Name: _StringToPattern
    ; Description: Bereitet einen String für eine StringRegExp-Pattern vor
    ; Parameter(s): $szStrToPattern = String der umgewandelt werden soll
    ; Requirement(s): keine
    ; Return Value(s): umgewandelter String
    ; Author(s): bernd670
    ;===============================================================================
    Func _StringToPattern($szStrToPattern)
    $szStrToPattern = StringReplace($szStrToPattern, "\", "\\")
    $szStrToPattern = StringReplace($szStrToPattern, ".", "\.")
    $szStrToPattern = StringReplace($szStrToPattern, "+", "\+")
    $szStrToPattern = StringReplace($szStrToPattern, "-", "\-")
    $szStrToPattern = StringReplace($szStrToPattern, "(", "\(")
    $szStrToPattern = StringReplace($szStrToPattern, ")", "\)")
    $szStrToPattern = StringReplace($szStrToPattern, "[", "\[")
    $szStrToPattern = StringReplace($szStrToPattern, "]", "\]")
    $szStrToPattern = StringReplace($szStrToPattern, "?", ".")
    $szStrToPattern = StringReplace($szStrToPattern, "*", ".*")

    Return $szStrToPattern
    EndFunc ;==>_StringToPattern

    [/autoit]
  • Hallo.

    BugFix, Du hast in dem Script oben folgende Zeilen:

    #include <array.au3>

    $StartPfad = "C:\"
    $SuchOrdner = "mappic"

    $Daten = _GetFileList($StartPfad, "n",1) ; erzeugt Array mit allen Ordnernamen
    $ret = _ArraySearch($Daten, $SuchOrdner,1,0,0,True) ; durchsucht nach Ordner
    If $ret > 0 Then MsgBox(0, '', $Daten[$ret]) ; gibt den kpl.Pfad zurück

    Wie macht man es, das er in das Verzeichnis springt und nicht die Msg-Ausgabe ausführt?

    LG, Lina.

    Lieben Gruß,
    Alina

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    Geheime Information: ;)
    OuBVU5ebLhHu5QvlnAyQB4A7SzBrvWulwL7RLl2BdH5tI6sIYspeMKeXMSXl