hey hab mal ne frage...im cmd wenn man da tree eingibt, bekommt man ja so einen Ordnerbaum
geht sowas mit autoit, also dass dies bis zu 5 unterordnern in eine datei geschrieben wird
Ordnerstruktur in datei schreiben
-
- [ offen ]
-
Reaker -
24. Oktober 2009 um 14:02 -
Geschlossen -
Erledigt
-
-
[autoit]
#include <Process.au3>
[/autoit]
_RunDOS("tree > C:/Tree.txt")Das ganze musst du dann nur noch mit Stringmanipulationen in eine vernünftige Form bringen
-
Habe mal was zusammengewürfelt. Habe das Script als anhang eingefügt.
-
also ich habe mich mal rangemacht und das is dabei herausgekommen:
Spoiler anzeigen
[autoit]#include <File.au3>
[/autoit]
#include <Array.au3>
Global $path = "D:\"
$file = @ScriptDir&"\tree.txt"
$result = ""
$array1 = _FileListToArray($path, "*", 2)
for $1 = 1 to $array1[0]
$array2 = _FileListToArray($path&$array1[$1], "*", 2)
for $2 = 1 to $array2[0]
$array3= _FileListToArray($path&$array1[$1]&"\"&$array2[$2], "*", 2)
for $3 = 1 to $array3[0]
$array4= _FileListToArray($path&$array1[$1]&"\"&$array2[$2]&"\"&$array3[$3], "*", 2)
for $4 = 1 to $array4[0]
$array5= _FileListToArray($path&$array1[$1]&"\"&$array2[$2]&"\"&$array3[$3]&"\"&$array4[$4], "*", 2)
for $5 = 1 to $array5[0]
$result &= $path&$array1[$1]&"\"&$array2[$2]&"\"&$array3[$3]&"\"&$array4[$4]&"\"&$array5[$5] & @crlf
FileWrite($file, $result)
Next
Next
Next
Next
Nextdas funktioniert an sich ganz gut nur dass irgendwann ein error kommt und das skript sich beendet
-
mach hald in den for schleifen
If @error Then exitloop
es hängt davon ab, dass keine datei mehr verfügbar ist
-
also ich habe jetz unter jedem for if @error then exitloop geschrieben:
Spoiler anzeigen
[autoit]#include <File.au3>
[/autoit]
#include <Array.au3>
Global $path = "D:\"
$file = @ScriptDir&"\tree.txt"
$result = ""
$array1 = _FileListToArray($path, "*", 2)
for $1 = 1 to $array1[0]
if @error Then ExitLoop
$array2 = _FileListToArray($path&$array1[$1], "*", 2)
for $2 = 1 to $array2[0]
if @error Then ExitLoop
$array3= _FileListToArray($path&$array1[$1]&"\"&$array2[$2], "*", 2)
for $3 = 1 to $array3[0]
if @error Then ExitLoop
$array4= _FileListToArray($path&$array1[$1]&"\"&$array2[$2]&"\"&$array3[$3], "*", 2)
for $4 = 1 to $array4[0]
if @error Then ExitLoop
$array5= _FileListToArray($path&$array1[$1]&"\"&$array2[$2]&"\"&$array3[$3]&"\"&$array4[$4], "*", 2)
for $5 = 1 to $array5[0]
if @error Then ExitLoop
FileWrite($file, $path&$array1[$1]&"\"&$array2[$2]&"\"&$array3[$3]&"\"&$array4[$4]&"\"&$array5[$5] & @crlf)
Next
Next
Next
Next
Nextprobleme...es kommt immernoch mein error
außerdem schaut euch das mal also da werden die pfade auch doppelt geschrieben
Spoiler anzeigen
Code
Alles anzeigenD:\Marcel\aircrack-ng\aircrack-ng-0.9.3-win\src\airodump-ng-airpcap D:\Marcel\aircrack-ng\aircrack-ng-0.9.3-win\src\airodump-ng-airpcap D:\Marcel\aircrack-ng\aircrack-ng-0.9.3-win\src\airodump-ng-peek D:\Marcel\aircrack-ng\aircrack-ng-0.9.3-win\src\airodump-ng-airpcap D:\Marcel\aircrack-ng\aircrack-ng-0.9.3-win\src\airodump-ng-peek D:\Marcel\aircrack-ng\aircrack-ng-0.9.3-win\src\GUI D:\Marcel\aircrack-ng\aircrack-ng-0.9.3-win\src\airodump-ng-airpcap D:\Marcel\aircrack-ng\aircrack-ng-0.9.3-win\src\airodump-ng-peek D:\Marcel\aircrack-ng\aircrack-ng-0.9.3-win\src\GUI D:\Marcel\aircrack-ng\aircrack-ng-0.9.3-win\src\wzcook D:\Marcel\aircrack-ng\aircrack-ng-0.9.3-win\src\airodump-ng-airpcap D:\Marcel\aircrack-ng\aircrack-ng-0.9.3-win\src\airodump-ng-peek D:\Marcel\aircrack-ng\aircrack-ng-0.9.3-win\src\GUI D:\Marcel\aircrack-ng\aircrack-ng-0.9.3-win\src\wzcook D:\Marcel\Bilder\Centerpark\iPod Photo Cache\F00 D:\Marcel\aircrack-ng\aircrack-ng-0.9.3-win\src\airodump-ng-airpcap D:\Marcel\aircrack-ng\aircrack-ng-0.9.3-win\src\airodump-ng-peek D:\Marcel\aircrack-ng\aircrack-ng-0.9.3-win\src\GUI D:\Marcel\aircrack-ng\aircrack-ng-0.9.3-win\src\wzcook D:\Marcel\Bilder\Centerpark\iPod Photo Cache\F00 D:\Marcel\Bilder\Centerpark\iPod Photo Cache\F01 D:\Marcel\aircrack-ng\aircrack-ng-0.9.3-win\src\airodump-ng-airpcap D:\Marcel\aircrack-ng\aircrack-ng-0.9.3-win\src\airodump-ng-peek D:\Marcel\aircrack-ng\aircrack-ng-0.9.3-win\src\GUI D:\Marcel\aircrack-ng\aircrack-ng-0.9.3-win\src\wzcook D:\Marcel\Bilder\Centerpark\iPod Photo Cache\F00 D:\Marcel\Bilder\Centerpark\iPod Photo Cache\F01 D:\Marcel\Bilder\Centerpark\iPod Photo Cache\F02 D:\Marcel\aircrack-ng\aircrack-ng-0.9.3-win\src\airodump-ng-airpcap D:\Marcel\aircrack-ng\aircrack-ng-0.9.3-win\src\airodump-ng-peek D:\Marcel\aircrack-ng\aircrack-ng-0.9.3-win\src\GUI D:\Marcel\aircrack-ng\aircrack-ng-0.9.3-win\src\wzcook D:\Marcel\Bilder\Centerpark\iPod Photo Cache\F00 D:\Marcel\Bilder\Centerpark\iPod Photo Cache\F01 D:\Marcel\Bilder\Centerpark\iPod Photo Cache\F02 D:\Marcel\Bilder\Centerpark\iPod Photo Cache\F03
-
Wenn ich dieses Script ausführe komm da:
C:\Dokumente und Einstellungen\Pride\Desktop\test.au3 (7) : ==> Subscript used with non-Array variable.:
for $1 = 1 to $array1[0]
for $1 = 1 to $array1^ ERROR -
@Pridrage
kann es sein dass bei dir der datenträger "D:" nicht existiert -
neein des kommt bei mir auch..des is ja grad mein error der immer kommt
-
Spoiler anzeigen
[autoit]#include <File.au3>
[/autoit] [autoit][/autoit] [autoit]
#include <Array.au3>Global $path = "C:\"
[/autoit]
Global $1,$2,$3,$4,$5
Dim $array1[1]
Dim $array2[1]
Dim $array3[1]
Dim $array4[1]
Dim $array5[1]
$file = @ScriptDir&"\tree.txt"
$result = ""
$array1 = _FileListToArray($path, "*", 2)
If IsArray($array1) Then
for $1 = 1 to $array1[0]
if @error Then ExitLoop
$array2 = _FileListToArray($path&$array1[$1], "*", 2)
If IsArray($array2) Then
for $2 = 1 to $array2[0]
if @error Then ExitLoop
$array3 = _FileListToArray($path&$array1[$1]&"\"&$array2[$2], "*", 2)
If IsArray($array3) Then
for $3 = 1 to $array3[0]
if @error Then ExitLoop
$array4= _FileListToArray($path&$array1[$1]&"\"&$array2[$2]&"\"&$array3[$3], "*", 2)
If IsArray($array4) Then
for $4 = 1 to $array4[0]
if @error Then ExitLoop
$array5 = _FileListToArray($path&$array1[$1]&"\"&$array2[$2]&"\"&$array3[$3]&"\"&$array4[$4], "*", 2)
If IsArray($array5) Then
for $5 = 1 to $array5[0]
if @error Then ExitLoop
FileWrite($file, $path&$array1[$1]&"\"&$array2[$2]&"\"&$array3[$3]&"\"&$array4[$4]&"\"&$array5[$5] & @crlf)
Next
Else
FileWrite($file, $path&$array1[$1]&"\"&$array2[$2]&"\"&$array3[$3]&"\"&$array4[$4]&"\"& @crlf)
EndIf
Next
Else
FileWrite($file, $path&$array1[$1]&"\"&$array2[$2]&"\"&$array3[$3]&"\"& @crlf)
EndIf
Next
Else
FileWrite($file, $path&$array1[$1]&"\"&$array2[$2]&"\"& @crlf)
EndIf
Next
Else
FileWrite($file, $path&$array1[$1]&"\"& @crlf)
EndIf
Next
Else
FileWrite($file, $path& @crlf)
EndIf
MsgBox(0,"Fertig","Fertig!")So scheint es bei mir zu klappen. Bin mir aber nicht sicher habs die tree.txt nur überflogen.
-
SEuBo
zählervariablen sind lokale zählervariablen, solche niemals gobal anlegen. das könnte ins auge gehn. generell sollte man nie variablen global anlegen
gut bei mir ist das jetzt auch der fall, aber nur weil ich keine richtige main habe sonst wären all diese auch localkopierter quellcode ist nie guter quellcode und dazu unübersichtlich
dafür eignen sich doch so schön rekursive funktionen
ich hab hier schnell mal eine geschrieben der dem treeview nahe kommen soll
sie kann dabei sehr variabel gehalten werden in anzahl der zu listenden unterverzeichnisseSpoiler anzeigen
[autoit]#Include <File.au3>
[/autoit] [autoit][/autoit] [autoit]$wurzelpfad = "C:"
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
$datei_handle = FileOpen(@ScriptDir&"\tree.txt", 1)
FileWrite($datei_handle, $wurzelpfad&"\"&@CRLF)
_liste_baum($wurzelpfad, 5)
FileClose($datei_handle)#cs _liste_baum($aktueller_pfad, $max[, $tab[, $counter)
[/autoit] [autoit][/autoit] [autoit]
$aktueller_pfad --> Verzeichnis ohne \ am Ende
$max --> wie viele unterpfade
$tab --> funktionsintern --> beim 1. aufruf "" rest
$counter --> funktionsintern --> (optional)
#ce
Func _liste_baum($aktueller_pfad, $max = -1, $tab = "", $counter = 0)
If $counter < $max Or $max == -1 Then
$aktuelle_liste = _FileListToArray($aktueller_pfad, "*")
If IsArray($aktuelle_liste) Then
For $i = 1 To $aktuelle_liste[0]
$aktuelle_datei = $aktueller_pfad&"\"&$aktuelle_liste[$i]
If StringInStr(Filegetattrib($aktuelle_datei), "D") Then
_schreibe($tab&"|"&@TAB&$aktuelle_liste[$i])
_liste_baum($aktuelle_datei, $max, $tab&@TAB, $counter+1)
Else
_schreibe($tab&@TAB&$aktuelle_liste[$i])
EndIf
Next
EndIf
EndIf
EndFuncFunc _schreibe($text)
[/autoit]
FileWrite($datei_handle, $text&@CRLF)
EndFuncje nachdem, wenn die einrückung unerwünscht is einfach die tabs raushauen
[autoit]
und wenn absolute pfade erwünscht sind, in dem funktionaufruf_schreibe()
[/autoit]die variable
[autoit]$aktuelle_liste[$i]
[/autoit]mit
[autoit]$aktuelle_datei
[/autoit]ersetzen
-
Zu aller erst: Danke. Ich bin immer für kontruktive Kritik und vor allem Hilfestellungen dankbar. Ich bin halt eigentlich noch ein ziemlicher Anfänger bezüglich der Programmierlogik. Das mit den global definitionen sollte ich mir ggf. wirklich mal abgewöhnen. Da ich aber nie 2 Varbiablen des selben namens ausgenommen $i, welches ich aber nie global definiere (so wie mans auch eigenltich tun sollte), in meinen eigenen Skripts verwende, is da bis jetzt noch nix schiefgegangen... Naja ich werd mir deine Lösung nochmal genauer anschauen - denn lernen kann auch daraus bestimmt wieder ne Menge...
Gruß SEuBo
-
Also variablen sind global schlecht wiel sie über die ganze programmlaufzeit leben und dadurch können sich fehler einschleichen, außerdem liegen sie die ganze zeit im arbeitsspeicher was bei richtig dicken variablen schon spürbar sien kann
hier mal ein beispiel
die lokale variable ist auserhalb der do until schleife nicht bekannt
wenn ich sie verändern möchte dann tu ich das mit call by referencedas heißt, in der funktion habe ich ein anderen namen für die in der schleife lokale variable, verändere sie aber trotzdem direkt
beispiel
Spoiler anzeigen
[autoit]Global $global = 200
[/autoit] [autoit][/autoit] [autoit]Do
[/autoit] [autoit][/autoit] [autoit]
Local $lokal = 100
Switch GUIGetMsg() ;irgendeine switch schleife
case $global
EndSwitch
_wert($global, $lokal)
MsgBox(0,"","Global: "&$global&" Lokal:"&$lokal)
Until TrueFunc _wert($wert1, ByRef $wert2)
[/autoit]
$wert1 = 1 ; das ist die globale variable, die nicht verändert wird
$wert2 = 1; das ist die lokale variable, sie wird im wert verändert (siehe msgbox)
EndFunchast du programmieren mit autoit gelernt?
falls du vorhast hinter die ganze logik, dateitypen etc zu kommen lern eine hochsprache wie c oder c++
das ist nicht all zu schwer und schafft feste grundlagen -
- Offizieller Beitrag
Achim89, theoretisch hättest Du recht, aber praktisch ist das bei AutoIt anders. Eine Variable, die Du nicht innerhalb einer Funktion deklarierst, ist bei AutoIt immer global, ganz gleich ob Du Dim, Local oder Global benutzt.
Beispiel:Spoiler anzeigen
[autoit]
[/autoit] [autoit][/autoit] [autoit]
Global $global = 200Local $lokal = 100
[/autoit] [autoit][/autoit] [autoit]_wert()
[/autoit] [autoit][/autoit] [autoit]MsgBox(0, "", "Global: " & $global & " Lokal:" & $lokal)
[/autoit] [autoit][/autoit] [autoit]Func _wert()
[/autoit]
$lokal = 500
EndFunc ;==>_wertErst wenn Du das Hauptprogramm in eine Funktion (Main) packst, bleibt die lokale Variable nur innerhalb der Funktion gültig:
Spoiler anzeigen
[autoit]
[/autoit] [autoit][/autoit] [autoit]
Global $global = 200
Main()Func Main()
[/autoit] [autoit][/autoit] [autoit]
Local $lokal = 100
_wert()
MsgBox(0, "", "Global: " & $global & " Lokal:" & $lokal)
EndFuncFunc _wert()
[/autoit]
$lokal = 500
EndFunc ;==>_wert -
Den Unterschied zwischen Global und Local definierter Variable kenn ich auch.
Wie AutoIt Variablen verwaltet wusste ich auch noch ( hab da vor 1 oder 2 tagen noch nen Thread drüber gelesen )
Locale variablen benutze ich allerdings nur in For-Schleifen. Alle anderen meiner in den Funktionen genutzen Vars sind global deklariert, weil ich viele davon in meinem Scripten Funktionsübergreifend nutzen muss. Sobald ich eine Variable in mehreren funktionen zu unterschieldichen Zwecken benutze, wird sie eh innerhalb jeder Funktion neu deklariert ( und zwar nicht local sondern global ).
Das mit der Speichernutzung wusste ich nicht - das wird mir aber wahrscheinlich helfen die Sache von einem anderen Blickwinkel zu sehen.Zu deiner Frage: Ja "Programmieren" hab ich mit AutoIT gelernt. Wobei ich es aber eher als rumspielen bezeichnen würde
Eine Hochsprache werd ich mir in absehbarer Zeit auch aneignen. Aber ich denke dass es nicht C/C++ sondern eher Java sein wird. Bin in Sachen Programmieren ein recht ungeduldiger Mensch, weswegen ich zb in AutoIt alle 5-10 mins auf den F5 knopf haue. Nach allem was ich so gehört hab kann ich mir das in C eher nicht erlauben, da es dir keine Fehler anzeigt (lieg ich da jezt falsch?)
Java hingegen soll genausoviel meckern wie zb AutoIT
Sowas is mir nur lieb und recht ! -
- Offizieller Beitrag
Um mal auf die ursprüngliche Frage zurückzukommen: Das einlesen eines Verzeichnisses inkl. Unterverzeichnisse.
Das geht am besten mit einer rekursiven Funktion:Spoiler anzeigen
[autoit]
[/autoit] [autoit][/autoit] [autoit]
#include <Array.au3>
$sPath = @ScriptDir
$aDirs = _RecursiveFileListToArray($sPath, '', 2)
_ArrayDisplay($aDirs)
$hFile = FileOpen(@ScriptDir & '\DirList.txt', 2)
If $hFile <> -1 Then
For $i = 1 To $aDirs[0]
FileWriteLine($hFile, $aDirs[$i])
Next
FileClose($hFile)
EndIf;===============================================================================
[/autoit]
; Function Name: _RecursiveFileListToArray($sPath[, $sPattern][, $iFlag][, $iFormat][, $iRecursion][, $sDelim])
; Description:: gibt Verzeichnisse (rekursiv) und/oder Dateien zurück, die einem RegExp-Pattern entsprechen
; Parameter(s): $sPath = Startverzeichnis
; $sPattern = ein beliebiges RexExp-Pattern für die Auswahl
; $iFlag = Auswahl
; 0 = Dateien & Verzeichnisse
; 1 = nur Dateien
; 2 = nur Verzeichnisse
; $iFormat = Rückgabeformat
; 0 = String
; 1 = Array mit [0] = Anzahl
; 2 = Nullbasiertes Array
; $iRecursion = Verzeichnisse rekursiv durchsuchen
; 0 = Nein
; 1 = Ja
; $sDelim = Trennzeichen für die String-Rückgabe
; Requirement(s): AutoIt 3.3.0.0
; Return Value(s): Array/String mit den gefundenen Dateien/Verzeichnissen
; Author(s): Oscar (http://www.autoit.de)
; Anregungen von: bernd670 (http://www.autoit.de)
;===============================================================================
Func _RecursiveFileListToArray($sPath, $sPattern = '', $iFlag = 0, $iFormat = 1, $iRecursion = 1, $sDelim = @CRLF)
Local $hSearch, $sFile, $sReturn = ''
If StringRight($sPath, 1) <> '\' Then $sPath &= '\'
$hSearch = FileFindFirstFile($sPath & '*.*')
If @error Or $hSearch = -1 Then Return SetError(1, 0, $sReturn)
While True
$sFile = FileFindNextFile($hSearch)
If @error Then ExitLoop
If StringInStr(FileGetAttrib($sPath & $sFile), 'D') Then
If StringRegExp($sPath & $sFile, $sPattern) And ($iFlag = 0 Or $iFlag = 2) Then $sReturn &= $sPath & $sFile & '\' & $sDelim
If $iRecursion Then $sReturn &= _RecursiveFileListToArray($sPath & $sFile & '\', $sPattern, $iFlag, 0)
ContinueLoop
EndIf
If StringRegExp($sFile, $sPattern) And ($iFlag = 0 Or $iFlag = 1) Then $sReturn &= $sPath & $sFile & $sDelim
WEnd
FileClose($hSearch)
If $iFormat And $sReturn = '' Then Return StringSplit($sReturn, '', $iFormat)
If $iFormat Then Return StringSplit(StringTrimRight($sReturn, StringLen($sDelim)), $sDelim, $iFormat)
Return $sReturn
EndFunc -
Also die letzten Antworten waren jetz das wonach ich gesucht habe...danke euch