Ich bin mir jetzt nicht ganz sicher, ob das hier der richtige Platz dafür ist. Falls nicht, bitte verschieben.
Was macht das Skript?
Kurze Antwort: Es kopiert so viele Hörspiel-Episoden auf einen USB-Stick bis dieser voll ist. Bei erfolgreichen Kopiervorgang, werden die Daten auf der Festplatte verschoben.
Lange Antwort:
Spoiler anzeigen
Die Geschichte zum Skript ist ganz simpel. Ich liebe Hörspiele. Und weil ich auf Arbeit Zugriff auf ein MP3-fähiges Autoradio habe, nehme ich mir diese mit um sie dort zu hören. Am Anfang hatte ich nur 4 Ordner die ich auf neue Episoden prüfen musste. Mitterweile sind aber über 20 und es macht überhaupt keinen Spaß diese per Hand zu überprüfen.
#cs ----------------------------------------------------------------------------
AutoIt Version: 3.3.18.0
Author: Seppuku
Script Function:
Befüllt meinen Hörspiel-Stick
#ce ----------------------------------------------------------------------------
#include <AutoItConstants.au3>
#include <File.au3>
#include <FileConstants.au3>
;Sticklaufwerk
Global $Stickdrive = "G:\"
Global $HoerspielRoot = "D:\Musik\Hörspiele\"
Global $HSPStickRoot = $Stickdrive & "03 - HSP\"
Global $HSPGehoertRoot = $HoerspielRoot & "zuHDD\"
Global $HSPSerieTitel ;Inhalt der Liste.txt als array
Global $ListeTXT = "Liste.txt"
#Region Prüfung ob Laufwerk und Liste.txt existieren
If Not FileExists($Stickdrive) Then
MsgBox(0, "Fataler Fehler", "USB-Stick nicht gefunden!")
Exit
EndIf
If Not FileExists($ListeTXT) Then
MsgBox(0, "Fataler Fehler", $ListeTXT & " nicht gefunden!")
Exit
EndIf
#EndRegion
#Region Stick löschen Anfang
;alle Ordner in 03 - HSP löschen (inkl den Ordner selbst)
DirRemove($Stickdrive & "03 - HSP", $DIR_REMOVE) ;1 = immer löschen, auch wenn was drin
;danach wieder erstellen
DirCreate($Stickdrive & "03 - HSP")
#EndRegion
#Region 02 - HSP
;Datei öffnen (read only), Serientitel erfassen
FileOpen($ListeTXT, $FO_READ)
_FileReadToArray($ListeTXT, $HSPSerieTitel)
$Titelnummer = 1
;große Schleife Serientitel aus Datei
For $Titelnummer = 1 To $HSPSerieTitel[0]
;Ordner einer Serie erfassen
$ArrayEpisodenOrdner = _FileListToArray($HoerspielRoot & $HSPSerieTitel[$Titelnummer], "*", $FLTA_FOLDERS)
;wenn Ordner vorhanden kopiere, danach verschieben
;kleine Schleife Ordner kopieren
If IsArray($ArrayEpisodenOrdner) Then
For $i = 1 To $ArrayEpisodenOrdner[0]
;kopiere Ordner zu Stick
$KopieReturn = DirCopy($HoerspielRoot & $HSPSerieTitel[$Titelnummer] & "\" & $ArrayEpisodenOrdner[$i], $HSPStickRoot & $HSPSerieTitel[$Titelnummer] & "\" & $ArrayEpisodenOrdner[$i])
;falls Fehler = Stick voll, beende hier
If $KopieReturn = 0 Then
MsgBox(64, "Fertig", "Stick ist voll!")
Exit
EndIf
;wenn erfolgreich kopiert, dann verschiebe Datei zu gehört
DirMove($HoerspielRoot & $HSPSerieTitel[$Titelnummer] & "\" & $ArrayEpisodenOrdner[$i], $HSPGehoertRoot & $HSPSerieTitel[$Titelnummer] & "\" & $ArrayEpisodenOrdner[$i])
Next
EndIf
Next
#EndRegion
;Erfolgreiches Ende, noch Platz
FileClose($ListeTXT)
MsgBox(0, "Fertig", "Es ist noch Platz!")
Exit
Alles anzeigen
Inhalt Liste.txt (Auszug)
Spoiler anzeigen
Van Dusen
Ghostsitter
John Sinclair
Midnight Tales
Faith - The Van Helsing Chronicles
Als ungelernter Anfänger habe ich dazu noch ein paar Fragen:
1) Was sagt ein Profi zu meinem Skript? Was würdet ihr anders machen?
2) Dateien lesen und schreiben kann ich ja problemlos mit z.B. FileReadLine, FileWriteLine, _FileReadToArray und so weiter und so fort. Wozu existiert dann FileOpen bzw. FileClose? Wenn diese beiden Befehle nicht mit drin stehen, funktioniert trotzdem alles so wie es soll.
3) Beim If-Block If $KopieReturn = 0 Then hab ich in einer früheren Version If @error Then benutzt. Das hat aber nicht funktioniert und ich kapiere das überhaupt nicht. Erst hab ich @error als universales Mittel bei Fehlern gehalten. Also wie ein boolscher Wert (true/false). Aber je mehr ich davon in der Hilfe lese, desto nutzloser wird das Ding. Den Fehler kann ich ja auch mit jeden anderen x-beliebigen Variable auslesen. Was ich dann ja auch mit $KopieReturn gemacht habe. Kann mir jemand das ganz simpel erklären oder ein Beispiel nennen, wo man unbedingt @error braucht?
Danke!