VBS msgbox meldung nach jeden durchsuchten Ordner und nicht am Schluß
Hallo
da mir immer hier geholfen wurde, wende ich mich mal wieder an Euch. Ich habe ein Script zur Löschung bestimmter Dateien (nach Namen) die über Verknüpfungen in meheren Ordnern gesucht werden.
Problem 1: Die Meldung per msgbox "die Datei gibt es nicht" sollte erst nach Duchsuchung aller Ordner inklusive Unterordner erscheinen, dieses geschieht aber bei jeden Ordner der durchsucht wird und diese Datei nicht beinhaltet. Zudem kommt die Msgbox Meldung "Fertig, Dateien gelöscht" nach jeder einzelne Löschung, die jeweilige Meldung soll natürlich nur einmalig am Ende kommen.
Problem 2: Im Ordner C:Max\test befinden sich mehre Verknüfungen (unterschiedliche Namen) die zu mehren Ordnern (unterschiedliche Namen) in denen sich zwei Unteordner mit den Namen Foto und Musik befinden, diese sollen auch nach der Datei gesucht und gelöscht werden.
Ich es versucht mit:
zweiter Versuch:
beide waren ohne Erfolg, was mache ich falsch?
Gruß
knuefi
[Edit Biber] Codetags, aber die bringen hier nur Zeilennummern. [/Edit]
da mir immer hier geholfen wurde, wende ich mich mal wieder an Euch. Ich habe ein Script zur Löschung bestimmter Dateien (nach Namen) die über Verknüpfungen in meheren Ordnern gesucht werden.
Const PFAD = "C:Max\test"
Set fso = CreateObject("Scripting.FileSystemObject")
Set objShell = CreateObject("Wscript.Shell")
strFile = Inputbox("Bitte Dateiname zum löschen eingeben")
IF strFile=FALSE THEN
CreateObject("WScript.Shell").Popup "Abruch,keine Datei gelöscht",4, "Information"
If (fso.FileExists(PFAD & strFile)) Then
fso.DeleteFile strFile,True
End If
End If
for each myFile in fso.GetFolder(PFAD).Files
If LCase(fso.GetExtensionName(myFile.Name)) = "lnk" then
target = objShell.CreateShortcut(myFile.Path).TargetPath & "\ "
If (fso.FileExists(target & "\" & strFile)) Then
fso.DeleteFile target & "\" & strFile,True
MsgBox "Fertig, Dateien gelöscht !!"
else
MsgBox "die Datei gibt es nicht !!"
End If
End If
Next
Problem 2: Im Ordner C:Max\test befinden sich mehre Verknüfungen (unterschiedliche Namen) die zu mehren Ordnern (unterschiedliche Namen) in denen sich zwei Unteordner mit den Namen Foto und Musik befinden, diese sollen auch nach der Datei gesucht und gelöscht werden.
Ich es versucht mit:
for each myFile in fso.GetFolder(PFAD).Files
If LCase(fso.GetExtensionName(myFile.Name)) = "lnk" then
target = objShell.CreateShortcut(myFile.Path).TargetPath & "\Foto" & "\Musik"
If (fso.FileExists(target & "\" & strFile)) Then
fso.DeleteFile target & "\" & strFile,True
zweiter Versuch:
for each myFile in fso.GetFolder(PFAD).Files
If LCase(fso.GetExtensionName(myFile.Name)) = "lnk" then
target = objShell.CreateShortcut(myFile.Path).TargetPath & "\*"
If (fso.FileExists(target & "\" & strFile)) Then
fso.DeleteFile target & "\" & strFile,True
Gruß
knuefi
[Edit Biber] Codetags, aber die bringen hier nur Zeilennummern. [/Edit]
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 299580
Url: https://administrator.de/contentid/299580
Ausgedruckt am: 22.11.2024 um 04:11 Uhr
18 Kommentare
Neuester Kommentar
Moin knuefi,
Leider kann ich nicht programmieren.
Aber ich glaube, wenn du die MsgBox() aus der For..Next genommen hättest, dann stünde diese Zeile bestimmt unterhalb der Zeile mit dem Wort "Next", oder?
Meinjanur...
Biber
Zitat von @Knuefi:
Hallo beidermachtvongreyscull,
leider verstehe ich das nicht, ich habe erstmal Versucht nur die Fertig Meldung aus der for next Schleife zu nehmen.
Hallo beidermachtvongreyscull,
leider verstehe ich das nicht, ich habe erstmal Versucht nur die Fertig Meldung aus der for next Schleife zu nehmen.
Leider kann ich nicht programmieren.
Aber ich glaube, wenn du die MsgBox() aus der For..Next genommen hättest, dann stünde diese Zeile bestimmt unterhalb der Zeile mit dem Wort "Next", oder?
Meinjanur...
Biber
Zitat von @Knuefi:
Hallo beidermachtvongreyscull,
leider verstehe ich das nicht, ich habe erstmal Versucht nur die Fertig Meldung aus der for next Schleife zu nehmen. So habe ich es probiert:
Obige Zeile startet eine for/nex-Schleife für jede Datei! Dies wird erst mit der "next"-Zeile beendet.Hallo beidermachtvongreyscull,
leider verstehe ich das nicht, ich habe erstmal Versucht nur die Fertig Meldung aus der for next Schleife zu nehmen. So habe ich es probiert:
Const PFAD = "C:Max\test"
> Set fso = CreateObject("Scripting.FileSystemObject")
> Set objShell = CreateObject("Wscript.Shell")
> strFile = Inputbox("Bitte Dateiname zum löschen eingeben")
> IF strFile=FALSE THEN
> CreateObject("WScript.Shell").Popup "Abruch,keine Datei gelöscht",4, "Information"
> If (fso.FileExists(PFAD & strFile)) Then
> fso.DeleteFile strFile,True
> End If
> End If
> for each myFile in fso.GetFolder(PFAD).Files
> If LCase(fso.GetExtensionName(myFile.Name)) = "lnk" then
> target = objShell.CreateShortcut(myFile.Path).TargetPath & "\ "
> If (fso.FileExists(target & "\" & strFile)) Then
> fso.DeleteFile target & "\" & strFile,True
> MsgBox "Fertig, Dateien gelöscht !!"
> End If
> End If
> MsgBox "Fertig, Dateien gelöscht !!"
> Next
>
Leider bekomme ich eine Fehlermeldung
Du musst Dich fragen, was Du ausgeben willst. Wenn Du die Fehlermeldung "Dateien gelöscht" ausgeben willst, wenn Du mindestens eine Datei gelöscht hast, arbeite mit einer Status-Variablen.
Das kann so aussehen:
for each myFile in fso.GetFolder(PFAD).Files
...
If (fso.FileExists(PFAD & strFile)) Then
fso.DeleteFile strFile,True
numDeleteStatus = 1
End If
...
next
...
if numDeleteStatus = 1 Then
MsgBox "Fertig, Dateien gelöscht !!"
End If
Moin knuefi,
meinst du nicht, du solltest erst mal mit einem kleinen Notizzettel und einem Werbekuli von der CeBit eine Skizze machen, wie denn der Programmablauf geplant ist?
Du brauchst doch einfach nur oberhalb der Zeile
noch eine äußere Schleife einfügen:
Grüße
Biber
meinst du nicht, du solltest erst mal mit einem kleinen Notizzettel und einem Werbekuli von der CeBit eine Skizze machen, wie denn der Programmablauf geplant ist?
Du brauchst doch einfach nur oberhalb der Zeile
strfile = Inputbox(...)
noch eine äußere Schleife einfügen:
Abfrage = vbRetry
do while Abfrage = vbRetry
strfile = Inputbox(...)
' .....(bisheriges Geraffel)
Abfrage = MsgBox ("die Datei gibt es im Ordner nicht",vbRetryCancel,"Information")
loop
Grüße
Biber
Hallo Knuefi,
ich schau mir das nun schon eine Zeit lang an ... damit das hier mal ein Ende hat und du anscheinend doch noch ziemliche Probleme mit den Grundlagen des Programmierens hast, hier mal ein komplettes kommentiertes Beispiel das all deine Punkte umsetzt.
Was @Biber auch schon angemerkt hat: Mach erst mal eine "vollständige" Skizze deines Vorhabens und erst dann setzt du dich hin und strukturierst das ganze, nicht anders herum.
Hoffentlich lernst du was draus
Grüße Uwe
p.s. meine dringende Empfehlung sich vielleicht doch erst mal mit den grundlegenden Dingen der Programmierung auseinander zu setzen, anstatt so quer einzusteigen.
ich schau mir das nun schon eine Zeit lang an ... damit das hier mal ein Ende hat und du anscheinend doch noch ziemliche Probleme mit den Grundlagen des Programmierens hast, hier mal ein komplettes kommentiertes Beispiel das all deine Punkte umsetzt.
Was @Biber auch schon angemerkt hat: Mach erst mal eine "vollständige" Skizze deines Vorhabens und erst dann setzt du dich hin und strukturierst das ganze, nicht anders herum.
' Basisordner festlegen
Const BASEFOLDER = "C:\Max\test"
' Variablen deklarieren
Dim arrFoundFiles(),cnt, strFind
' Count-Variable initialisieren diese enthält die Anzahl der gefundenen Dateien
cnt = 0
' benötigte Objekte erstellen
Set fso = CreateObject("Scripting.FileSystemObject")
Set objShell = CreateObject("Wscript.Shell")
' Schleife für Wiederholungen
Do While cnt = 0
' Suchstring abfragen
strFind = InputBox("Bitte zu suchenden Dateinamen eingeben:","Dateiname","test.txt")
' Wenn User Cancel klickt oder keinen String eingibt abbrechen
If strFind = False Or strFind = "" Then Exit Do
' Suche im Basisordner mit Suchbegriff starten
FindFilesRecursive fso.GetFolder(BASEFOLDER),strFind
' Wurde keine Datei gefunden, Nachfrage ob erneut gesucht werden soll, ansonsten Abbruch
If cnt = 0 Then
If MsgBox("Die Suche war nicht erfolgreich. Möchten sie die Eingabe wiederholen?",vbYesNo Or vbQuestion) = vbNo Then
' Springe aus der Schleife
Exit Do
End If
Else
' Suche war erfolgreich, zeige die gefundenen Dateien an und frage ob sie gelöscht werden sollen
If MsgBox("Die Suche hat folgende Dateien gefunden: " & vbNewLine & vbNewline & Join(arrFoundFiles,vbNewLine) & vbNewLine & vbNewLine & "Möchten sie diese nun löschen?", vbQuestion Or vbYesNo) = vbYes Then
' Dateien die gefunden wurden löschen
For Each file In arrFoundFiles
fso.DeleteFile file, True
Next
End If
End If
Loop
'Funktion duchsucht Verzeichnisse rekursiv inkl. 'lnk' Auswertung
Function FindFilesRecursive(objFolder, strSearch)
if fso.FileExists(objFolder.Path & "\" & strSearch) Then
ReDim Preserve arrFoundFiles(cnt)
arrFoundFiles(cnt) = objFolder.Path & "\" & strSearch
cnt = cnt + 1
End If
for each file in objFolder.Files
If LCase(fso.GetExtensionName(file.Name)) = "lnk" Then
FindFilesRecursive fso.GetFolder(objShell.CreateShortcut(file.Path).TargetPath),strSearch
End If
Next
For Each subfolder In objFolder.SubFolders
FindFilesRecursive subfolder, strSearch
Next
End Function
Grüße Uwe
p.s. meine dringende Empfehlung sich vielleicht doch erst mal mit den grundlegenden Dingen der Programmierung auseinander zu setzen, anstatt so quer einzusteigen.
Das Skript oben durchsucht alles, d.h. alle Unterordner rekursiv und alle Ordner die durch *.lnk Verknüpft wurden ebenfalls rekursiv. Also tutto completto wie man so schön sagt.
Wenn in deinen LNKs nur deine zwei Ordner durchsucht werden sollen, ändere nur die Funktion des oberen Codes so ab:
- edit - Tippfehler behoben
Wenn in deinen LNKs nur deine zwei Ordner durchsucht werden sollen, ändere nur die Funktion des oberen Codes so ab:
Function FindFilesRecursive(objFolder, strSearch)
if fso.FileExists(objFolder.Path & "\" & strSearch) Then
ReDim Preserve arrFoundFiles(cnt)
arrFoundFiles(cnt) = objFolder.Path & "\" & strSearch
cnt = cnt + 1
End If
for each file in objFolder.Files
If LCase(fso.GetExtensionName(file.Name)) = "lnk" Then
strTarget = objShell.CreateShortcut(file.Path).TargetPath
For Each f In Array("Foto","Musik")
If fso.FolderExists(strTarget & "\" & f) then
FindFilesRecursive fso.GetFolder(strTarget & "\" & f),strSearch
End if
Next
End If
Next
For Each subfolder In objFolder.SubFolders
FindFilesRecursive subfolder, strSearch
Next
End Function
- edit - Tippfehler behoben
[OT] @colinardo
In Zeile 14 hast du nach dem Copy&Paste nicht nachgearbeitet....
gibt gab es zweimal, was immer verdächtig ist bei Scriptern, die nicht nach lines per hour bezahlt werden.
So wird dieser Thread
a) nie fertig
b) nie mein Lieblingsbeitrag
aber ich bewundere deine Geduld...
Grüße
Biber
[/OT]
In Zeile 14 hast du nach dem Copy&Paste nicht nachgearbeitet....
FindFilesRecursive fso.GetFolder(strTarget & "\Fotos"),strSearch '
-> diese Zeile So wird dieser Thread
a) nie fertig
b) nie mein Lieblingsbeitrag
aber ich bewundere deine Geduld...
Grüße
Biber
[/OT]
So wird dieser Thread
a) nie fertig
Bei Minions wird doch sowieso nie was fertig a) nie fertig
Zitat von @Knuefi:
Ich bin erlich, ich habe den Tippfehler immer noch nicht gefunden. Na ja, ich gelobe Besserung. Ich traue mich gar nicht zu fragen, aber nur so kann ich dazu lernen. Was bedeutet das ?: (strTarget & "\" & f). Das &"\" ist mir klar, aber was bedeutet das & f?
Ich bin erlich, ich habe den Tippfehler immer noch nicht gefunden. Na ja, ich gelobe Besserung. Ich traue mich gar nicht zu fragen, aber nur so kann ich dazu lernen. Was bedeutet das ?: (strTarget & "\" & f). Das &"\" ist mir klar, aber was bedeutet das & f?
Der Fehler war ein fehlendes & für die Verknüpfung der Variablen in dieser Zeile
fso.FolderExists(strTarget & "\" & f)
Das Konstrukt ist eine einfache ForEach-Schleife die das Array bestehend aus den Strings Foto und Musik durchläuft. In der Variablen f steht dann jeweils entweder Foto oder Musik. Das ist eine Methode um sich mehrfach wiederholenden Codefragmente einzusparen.
strTarget = objShell.CreateShortcut(file.Path).TargetPath
For Each f In Array("Foto","Musik")
If fso.FolderExists(strTarget & "\" & f) then
FindFilesRecursive fso.GetFolder(strTarget & "\" & f),strSearch
End if
Next