imrazor
Goto Top

VBScript - Ordner auf Inhalt prüfen?

Mit einem VBScript prüfen, ob in einem Ordner Dateien vorhanden sind?

Hallo Leute!

Wie bereits in meinem Beitrag Dateien verschieben mit VBScript beschrieben, habe ich ein Skript gebastelt, dass mir alle Dateien verschiebt bzw. kopiert.

Nun habe ich festgestellt, dass es zu einer Fehlermeldung kommt, wenn im Ordner keine Dateien vorhanden sind.

Ich wollte also eine Abfrage einbaun, die prüft, ob in diesem Ordner Dateien vorhanden sind und wenn ja, dann sollten diese verschoben werden. Wenn nein, soll einfach nix gemacht werden.

Füre ich das Skript aus, passiert einfach gar nichts. Es wird also nichts verschoben, selbst wenn Dateien vorhanden sind.

Hat jemand einen Rat, wie man am besten eine solche Abfrage programmiert?


Hier die ganze Verschiebe-Funktion:

Function Move(Quellpfad, Zielpfad)

Set FSO = CreateObject("Scripting.FileSystemObject")  
Set Quelle = FSO.GetFolder(Quellpfad)
Set Ziel = FSO.GetFolder(Zielpfad)

If FSO.FileExists(Quellepfad & "\*.*") then  

	FSO.MoveFile Quellpfad & "\*.*", Zielpfad & "\"  
Else
	
End if

End Function

Content-ID: 135525

Url: https://administrator.de/contentid/135525

Ausgedruckt am: 29.11.2024 um 16:11 Uhr

76109
76109 09.02.2010 um 12:54:09 Uhr
Goto Top
Hallo Imrazor!

FileExists funktioniert nicht mit Wildcards, nur mit expliziten Dateipfaden.

Mach es über eine Each-Schleife:
Wenn keine Datei, dann keine Aktion
Wenn eine oder mehrere Dateien, dann alle Datei verschieben

Mindestens 1 Datei, Befehl ausführen und Schleife beenden
For Each File in Quelle.Files
    FSO.MoveFile Quellpfad & "\*.*", Zielpfad & "\":  Exit For  
Next

Gruß Dieter
KingNothing
KingNothing 09.02.2010 um 12:58:21 Uhr
Goto Top
If FSO.FileExists(Quellepfad & "\*.*") then   
Zunächst mal hast du da einen Tippfehler drin, laut deinen Variablen müsste es "Quellpfad" heißen anstelle von "Quellepfad"

Eine Möglichkeit, die auch im Script-Center von Microsoft steht, ist, auf die Ordnergröße zu prüfen.
Das Ordner-Objekt Quelle hast du ja schon erzeugt, dann kann man es auch direkt dafür verwenden.

If (Not(Quelle.Size = 0)) Then
     ' Dein Code  
End if

Gruß martin
76109
76109 09.02.2010 um 13:37:10 Uhr
Goto Top
Hallo Imrazor!

Der Vorschlag von KingNothing ist natürlich besser, aber dann würde ich es so machen:
Sub Move(Quellpfad, Zielpfad)

    Set FSO = CreateObject("Scripting.FileSystemObject")  

    If FSO.GetFolder(Quellpfad).Files.Count > 0 Then
        FSO.MoveFile Quellpfad & "\*.*", Zielpfad & "\"  
    End If
End Sub

Gruß Dieter
Imrazor
Imrazor 09.02.2010 um 14:05:42 Uhr
Goto Top
Vielen Dank für die schnelle Hilfe, beides funktioniert einwandfrei!

Bin echt begeistert von den schnellen und kompenten Antworten, die ich hier immer kriege! Großes Lob!
KingNothing
KingNothing 09.02.2010 um 16:09:41 Uhr
Goto Top
Das ist natürlich die Optimalere Lösung,
das andere hatte ich nur nach relativ schnellem Suchen gefunden (Script-Center aufm Desktop)

Gruß Martin
76109
76109 09.02.2010 um 17:09:46 Uhr
Goto Top
Hallo Martin!

Deine Anregung war aber insofern gut, weil ich aus dem Stehgreif garnicht lange überlegt habe und erst durch Dich, auf die sinnvollere Lösung gekommen binface-smile

Also, haben wir beide in Teamarbeit eine optimale Lösung gefundenface-wink

Gruß Dieter
Duswald
Duswald 03.01.2011 um 21:51:06 Uhr
Goto Top
Das ist genau das script snippet das ich gesucht habe. Es scheint mir hier genau die Menschen zu geben, die mir vielleicht ein wenig helfen könnten mit vbs

Wenn ich die Sub richtig verstehe, stellt sie fest, ob ein verzeichniss lehr ist oder nicht.

das ist genau was ich suchte.
so nun habe ich eine kleine Herrausforderung vor der ich stehe und kenn mich null aus mit vbs

also ich habe ein Verzeichnis in dem sind mehrere Unterverzeichnisse. Diese sollen jetzt darauf untersucht werden ob sie lehr sind, und wenn nicht, sollte jeweils für ein verzeichnis wo ne datei drin ist, folgende Zeilen in eine xml Datei eigefügt werden:

        <line>
            <mode>Execute</mode>
            <entry>NameDesUnterverzeichnisesMitInhalt</entry>
            <count>3</count>
            <options>0</options>
        </line>

bei jeden aufruf sollte die xml datei lehr gemacht werden und die zeilen neu reingeschrieben werden .. geht sowas mit vbs und wie könnt ich das realisieren?

Danke für jeden Tipp face-smile
Andy
Biber
Biber 03.01.2011 um 22:05:17 Uhr
Goto Top
Moin Duswald,

willkommen im neuen Jahr und im Forum.

Ich habe gesehen, dass du als in deinem Profil "Beruf: Creative Director" angegeben hast.
Das entschuldigt aber nicht alles.

Bitte mach noch mal mit orthografisch etwas konservativerer Schreibweise einen neuen Beitrag auf, da erstens die noch folgenden nötigen Rückfragen einen eigenen Beitrag rechtfertigen und zweitens ja nun das Ermitteln der Datei-Anzahl je Ordner nur der kleinere Teil des Problems ist.

Dieser Beitrag hier ist eigentlich hinreichend beantwortet.

Grüße
Biber
Duswald
Duswald 03.01.2011 um 22:14:47 Uhr
Goto Top
Zitat von @Biber:
Moin Duswald,

willkommen im neuen Jahr und im Forum.

Ich habe gesehen, dass du als in deinem Profil "Beruf: Creative Director" angegeben hast.
Das entschuldigt aber nicht alles.

Bitte mach noch mal mit orthografisch etwas konservativerer Schreibweise einen neuen Beitrag auf, da erstens die noch folgenden
nötigen Rückfragen einen eigenen Beitrag rechtfertigen und zweitens ja nun das Ermitteln der Datei-Anzahl je Ordner nur
der kleinere Teil des Problems ist.

Dieser Beitrag hier ist eigentlich hinreichend beantwortet.

Grüße
Biber

Danke Für den Hinweis Biber und auch allen im Forum ein gutes neues Jahr
Gegen meine latente Rechtschreibschwäche kämpf ich seit 30 Jahre das wird wohl mit dem Alter nicht mehr besser, aber Du hast Recht, ich werd das neu Posten und dann auch andere schon vorhandene Ansätze gleich mit einbauen in die Frage, aber heut wirds nix mehr, ich versuch es dann morgen zu schaffen.
Danke und bis morgen wenn möglich
Duswald
Duswald 03.01.2011 um 23:34:22 Uhr
Goto Top
Hallo Nochmal kurz

Hab ein wenig rumgegoogelt und verschiedene Snippets zusammengewürfelt und Plötzlich hatte ich dann die Lösung zusammengebracht ...

Auch ein Blindes Legesteniker Huhn findet ab und an ma ein Korn.

hier meine Lösung zu der gestellten Frage von Vorhin:

Dim fsoA, tfA, cnt  
Const FOR_READING = 1

set myWs = CreateObject("Wscript.Shell")   

Sub ShowFolderList(folderspec, tf)
    Dim fs, f, f1, fc, s
    Set fs = CreateObject("Scripting.FileSystemObject")  
    Set f = fs.GetFolder(folderspec)
    Set fc = f.SubFolders
    For Each f1 in fc
		If f1.Files.Count > 1 Then
		Select Case f1.name
		Case "Apple Software Update":  
        'inix machen  
		Case Else
		    tf.WriteLine("    <line>")  
		    tf.WriteLine("        <mode>Execute</mode>")  
		    tf.WriteLine("        <entry>" & f1.name & "</entry>")  
		    tf.WriteLine("        <count>3</count>")  
		    tf.WriteLine("        <options>0</options>")  
		    tf.WriteLine("    </line>")  
		
	        s = s & f1.name
	        s = s &  vbCrLf
		End Select
		End If
    Next
    MsgBox s
End Sub


Set fsoA = CreateObject("Scripting.FileSystemObject")  
Set tfA = fsoA.CreateTextFile("C:\000test.txt", True)  
tfA.WriteLine("#EXTM3U")  
ShowFolderList "c:\Programme", tfA   
tfA.Close

Das is es was ich im Prinzip wollte ... Bisserl finetunen noch ... aber dann gehts schon.
Dann mach ich nicht extra noch nen thread auf und hoffe, das der ein oder andere Besucher das dann auch irgendwie sinnvoll findet und verwenden kann.

Liebe Grüße aus Bayern: Andy
Duswald
Duswald 03.01.2011 um 23:40:12 Uhr
Goto Top
ahh kurz zur erklärung noch, es werden da jetzt nur zu testzwecken die folders C:/Programme genutzt.
Mit dem Select case, kann ich dann noch bestimmte Folders generell ausschliesen vom erfassen. Da gäbs warscheinlich noch elegantere methoden für, aber es is halt ne quick n Dirty Lösung meinem vbs horizont entsprechend face-smile
KingNothing
KingNothing 04.01.2011 um 08:39:30 Uhr
Goto Top
Hi,

Frohes neues Jahr zusammen!

Nur noch ein, nein besser zwei kleine Tipps am Rande für dich als VBS-Neuling:

1. Aussagekräftige Variablenbezeichnungen: Soweit ich weiss, gibt es in VBS kein Limit für Variablennamen, daher würde ich immer möglichst gut beschreibende Namen verwenden.
Also z.B. anstelle von "For Each f1 in fc"
kann man machen: "For Each folder in folderList"

2. Kommentare: Kommentier' deinen Code. Besser ist das.
Kommentare kannst du mit ' einfügen. Wenn du einen Editor wie z.B. SciTE benutzt, dann gibts für's Ein- und Auskommentieren sogar Shortcuts.

Wenn du diese zwei Tipps noch berücksichtigst, wirst du es dir selber später danken, nämlich dann, wenn du oder einer deiner Kollegen deinen eigenen Code lesen/verstehen/ändern muss(t). Ohne Kommentare ist das schwerer als es sich jetzt anhört, insbesondere für andere.

LG Martin
bastla
bastla 04.01.2011 um 15:27:02 Uhr
Goto Top
... und wenn schon Deklarationen (mit "Dim"), dann aber auch für alle Variablen (auch wenn sie, wie "myWs", entbehrlich sind - die wird nämlich ebenso wenig verwendet wie die Konstante aus Zeile 2 face-wink). Wenn dann noch ein "Option Explicit" am Anfang des Scripts steht, kannst Du auch falsch geschriebene Variablennamen sehr leicht finden ...

Grüße
bastla
KingNothing
KingNothing 04.01.2011 um 16:11:36 Uhr
Goto Top
Stimmt, das obligatorische Option Explicit hab ich vergessen. Asche auf mein Haupt ;)
Und wieder ein Schritt richtung sauberer Code ...

LG Martin
Duswald
Duswald 04.01.2011 um 18:12:47 Uhr
Goto Top
Danke für den Hinweis, das hab ich halt aus irgendwelchen Skripten so zusammenkopiert, bis dass es das gemacht hat was ich wollte, deshalb sind wohl auch sachen drin die ich gar nicht brauchte

Danke euch
Duswald
Duswald 04.01.2011 um 18:13:51 Uhr
Goto Top
ha - Jetzt doch noch eine Frage

was müßte ich da rein schreiben, damit er Dateien, die älter als 3 Tage sind und mp3 als dateiendung haben beim du8rchlaufen gleich rauslöscht?
Biber
Biber 04.01.2011 um 18:24:16 Uhr
Goto Top
Moin Duswald,

Zitat von @Duswald:
ha - Jetzt doch noch eine Frage

was müßte ich da rein schreiben, damit er Dateien, die älter als 3 Tage sind und mp3 als dateiendung haben beim
du8rchlaufen gleich rauslöscht?
Wie wäre es mit
"Hallo Moderator, bitte diesem Beitrag schliessen, bevor ich immer weiter von Ästlein auf Zweiglein komme,
bevor ich endlich einen eigenen Beitrag zu meinen eigenen Anforderungen aufmache."


Zur Not kannst du auch das "bitte" weglassen face-wink

Grüße
Biber

Manchmal denke ich, das Ansingen gegen eine rauschende Brandung wäre viel stressärmer als dieses erbärmliche Halbmod-Dasein hier im Forum....
<tiefer Seufzer>
Duswald
Duswald 06.01.2011, aktualisiert am 18.10.2012 um 18:45:25 Uhr
Goto Top
Hallo Biber - also ich hab jetzt mal nach anweisungen von hier das Script etwas verändert, aber es klappt nicht und deshalb habe ich wie du wolltest eine neue Frage aufgemacht um hier das nun zu beenden. Die neue Frage ist hier ...
Ordner durchsuchen und namen in xml Datei schreiben
Und ich hoffe, dass ich sie richtig plaziert habe.

Danke euch mal soweit für eure Hilfe