Ahaaaaah !
Es sind mal wieder die einfachsten Dinge, die einem die größten Kopfschmerzen bereiten...
Gruß
Greenhorn
Ahaaaaah !
Es sind mal wieder die einfachsten Dinge, die einem die größten Kopfschmerzen bereiten...
Gruß
Greenhorn
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:
Das hat den Nachteile das das aktuelle Verz. (C:\) nicht durchsucht wird.
Bei mir lautet der Befehl:
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.
#include <Constants.au3>
#include <Array.au3>
Local $aszDirSearch[3][2] = [ [ "Temp", "C:\" ], _
[ "Temp", "D:\" ], _
[ "Tools", "D:\" ] _
]
Local $aszFileSearch[2][2] = [ [ "*.au3", "C:\" ], _
[ "*.au3", "D:\" ] _
]
$Ordner = _DirSearch($aszDirSearch)
_ArrayDisplay($Ordner, "Ausgabe")
$Files = _FileSearch($aszFileSearch)
_ArrayDisplay($Files, "Ausgabe")
; =================================================================================================
; 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]
Return SetError(0,0,$aResult)
EndFunc ;==>_DirSearch
; =================================================================================================
; 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]
Return SetError(0,0,$aResult)
EndFunc ;==>_FileSearch
;=======================================================================================
;===============================================================================
; 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
;===============================================================================
; 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
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.
Alles anzeigenAlso was jetzt?
- du kennst den Ordnernamen
- du weißt aber nicht auf welchem Laufwerk
- du weißt nicht in welchem anderen Verzeichnis er sein könnte==> also rekursiv ein Laufwerk nach dem anderen durchsuchen
So gehts, nur noch in einer Schleife laufen lassen um alle Laufwerke zu durchsuchen.
Spoiler anzeigen
[autoit]#include <array.au3>
[/autoit] [autoit][/autoit] [autoit]$StartPfad = "C:\"
[/autoit] [autoit][/autoit] [autoit]
$SuchOrdner = "ORDNER-NAME"$Daten = _GetFileList($StartPfad, "n",1) ; erzeugt Array mit allen Ordnernamen
[/autoit] [autoit][/autoit] [autoit]
$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; AutoIt Version: 3.0
[/autoit] [autoit][/autoit] [autoit]
; Language: English
; Platform: Win9x/NT/XP
; Author: jos van der Zande
;
; Find files in directory and subdirectories and return it in an Array, all coded in Autoit3
;
;********************************************************************************
;Recursive search for filemask
;********************************************************************************Func _GetFileList($T_DIR,$T_MASK,$DIR_ONLY=0)
[/autoit]
Dim $N_DIRNAMES[200000] ; max number of directories that can be scanned
Local $N_DIRCOUNT = 0
Local $N_FILE
Local $N_SEARCH
Local $N_TFILE
Local $N_OFILE
Local $T_FILENAMES
Local $T_FILECOUNT
Local $T_DIRCOUNT = 1
Local $FILEMASK
; check Filemask \ for empty File-Array by GetDirOnly
If $FILEMASK = "n" Then $FILEMASK = "*.no"
; remove the end \ If specified
If StringRight($T_DIR,1) = "\" Then $T_DIR = StringTrimRight($T_DIR,1)
$N_DIRNAMES[$T_DIRCOUNT] = $T_DIR
; Exit if base dir doesn't exists
If Not FileExists($T_DIR) Then Return 0
; keep on looping until all directories are scanned
While $T_DIRCOUNT > $N_DIRCOUNT
$N_DIRCOUNT = $N_DIRCOUNT + 1
; find all subdirs in this directory and save them in a array
$N_SEARCH = FileFindFirstFile($N_DIRNAMES[$N_DIRCOUNT] & "\*.*")
While 1
$N_FILE = FileFindNextFile($N_SEARCH)
If @error Then ExitLoop
; skip these references
If $N_FILE = "." Or $N_FILE = ".." Then ContinueLoop
$N_TFILE = $N_DIRNAMES[$N_DIRCOUNT] & "\" & $N_FILE
; if Directory than add to the list of directories to be processed
If StringInStr(FileGetAttrib( $N_TFILE ),"D") > 0 Or _
StringInStr(FileGetAttrib( $N_TFILE ),"D,H,S") > 0 Then
$T_DIRCOUNT = $T_DIRCOUNT + 1
$N_DIRNAMES[$T_DIRCOUNT] = $N_TFILE
EndIf
Wend
FileClose($N_SEARCH) ; find all Files that mtach the MASK
$N_SEARCH = FileFindFirstFile($N_DIRNAMES[$N_DIRCOUNT] & "\" & $T_MASK )
If $N_SEARCH = -1 Then ContinueLoop
While 1
$N_FILE = FileFindNextFile($N_SEARCH)
If @error Then ExitLoop
; skip these references
If $N_FILE = "." Or $N_FILE = ".." Then ContinueLoop
$N_TFILE = $N_DIRNAMES[$N_DIRCOUNT] & "\" & $N_FILE
; if Directory than add to the list of directories to be processed
If StringInStr(FileGetAttrib( $N_TFILE ),"D") = 0 Or _
StringInStr(FileGetAttrib( $N_TFILE ),"D,H,S") = 0 Then
$T_FILENAMES = $T_FILENAMES & $N_TFILE & @CR
$T_FILECOUNT = $T_FILECOUNT + 1
;MsgBox(0,'filecount ' & $T_FILECOUNT ,$N_TFILE)
EndIf
Wend
FileClose($N_SEARCH)
Wend
If $DIR_ONLY = 0 Then
$T_FILENAMES = StringTrimRight($T_FILENAMES,1)
$N_OFILE = StringSplit($T_FILENAMES,@CR)
Return( $N_OFILE )
Else
ReDim $N_DIRNAMES[$N_DIRCOUNT+1]
$N_DIRNAMES[0] = $N_DIRCOUNT
Return $N_DIRNAMES
EndIf
EndFunc ;==>_GetFileList
Wie macht man es, das er in das Verzeichnis springt und nicht die Msg-Ausgabe ausführt?
Welches Programm soll denn in dieses Verzeichnis wechseln?