gurkenhobel
Goto Top

VBS: Erlaubnis verweigert in For-Next-Schleife

Hallo Gemeinde,
wieder stehe ich vor einem Problemchen.
Als VBS-Neuling habe ich ein vorhandenes Script modifiziert.
Dieses soll alle Unterordner eines genannten (oder des aktuellen) Verzeichnisses durchsuchen und für jeden Unterordner die Anzahl der gefundenen Dateien angeben. Schließlich soll das Ergebnis (einschl. der Gesamtzahl von Dateien) in eine Log-Datei dikumentiert werden. Rekursionstiefe unbegrenzt.

Das von mir modifizierte Script bringt eine Erlaubnisverweigerung in Zeile 18.
Außerdem fehlt die Gesamtzahl der Dateien.
Und ich hätte gerne das Startverzeichnis (hier also 'Digitale Bilder' ) weggelassen;
also z.B. Start im Ordner Reisen
  • Reisen\USA\Colorado wäre falsch --> richtig wäre USA\Colorado
  • Reisen\USA\California\Los Angeles wäre falsch --> stattdessen USA\California\Los Angeles

Über Hilfe würde ich mich sehr freuen

Micha:

Dim goFso, gcsFolder, gcsSubFolder, lcsSubFolder
Set goFso = CreateObject("Scripting.FileSystemObject")  
set gcsFolder = goFso.GetFolder("i:\Digitale Bilder\Reisen\USA")   
' set gcsFolder = goFso.GetFolder(".") ' aktuelle Ordner  
const strLogFile="log.txt"  

Call CountFiles(gcsFolder)
Set gcsSubFolder = gcsFolder.SubFolders
Set objFile = goFso.CreateTextFile(strLogFile)

For Each SubFolder In gcsSubFolder
    Call countFiles(SubFolder)
next

Sub CountFiles(folder)
    Dim lcsFolder, lcsSubFolder
    set lcsFolder = goFso.GetFolder(folder)
    set objFile = goFso.CreateTextFile(strLogFile) <--- 
    objFile.WriteLine ("Ordner: ") & gcsFolder  
    objFile.WriteLine ("¯¯¯¯¯¯¯¯¯¯¯¯¯¯")  
    objFile.WriteLine(Folder & " : " &lcsFolder.files.count)  
    '    WScript.Echo(Folder & " : " &lcsFolder.files.count)  
    set lcsSubFolder = lcsFolder.SubFolders
        For Each sSubFolder In lcsSubFolder
            Call CountFiles(sSubFolder)
        Next

    Set lcsSubFolder = Nothing
    Set lcsFolder = nothing
objFile.close
End Sub

Set gcsSubFolder = nothing
set gcsFolder = nothing
Set goFso = nothing 

Content-Key: 260452

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

Printed on: April 16, 2024 at 06:04 o'clock

Mitglied: 114757
114757 Jan 20, 2015 at 12:54:28 (UTC)
Goto Top
const strLogFile="log.txt"  
Dim goFso, gcsFolder, subfolder,objFile
Set goFso = CreateObject("Scripting.FileSystemObject")  
set gcsFolder = goFso.GetFolder("i:\Digitale Bilder\Reisen")   
Set objFile = goFso.CreateTextFile(strLogFile)

For Each subfolder In gcsFolder.SubFolders
	folderCount = 0
	strSubFolders = ""  
	CountFiles subfolder
	objFile.WriteLine "Ordner: " & subfolder.Path  
	objFile.WriteLine "Gesamtanzahl Dateien : " & folderCount  
	objFile.WriteLine strSubFolders
	objFile.WriteLine "------------------------"  
Next
objFile.Close
MsgBox "Feddich"  
set gcsFolder = nothing
Set goFso = Nothing
Set objFile = Nothing

Sub CountFiles(folder)
	On Error Resume Next
	folderCount = folderCount + folder.files.count
    strSubFolders = strSubFolders & folder.Path & " : " & folder.files.count & vbNewLine  
    For Each sSubFolder In folder.SubFolders
        CountFiles sSubFolder
    Next
End Sub
Gruß jodel32
Member: Gurkenhobel
Gurkenhobel Jan 20, 2015 at 14:43:27 (UTC)
Goto Top
Danke Dir,
ja soweit geht das Script schon ganz gut, habe die Zeilen 11 u. 12 auskommentiert.

- es fehlt eben nur noch die Gesamtzahl aller Dateien im angegebenen gcsfolder und darunter
- und der verkürzte Ordner-Link (statt E:\DigiBilder\Reisen\USA\California\Los Angeles --> Reisen\USA\California\Los Angeles wenn man bei DigiBilder das Script 'startet'.)
Mitglied: 114757
Solution 114757 Jan 20, 2015, updated at Jan 22, 2015 at 11:53:21 (UTC)
Goto Top
Zitat von @Gurkenhobel:

Danke Dir,
ja soweit geht das Script schon ganz gut, habe die Zeilen 11 u. 12 auskommentiert.
Wieso ?? Darin steht gerade eben die Gesamtanzahl der Dateien des jeweiligen Ordners aus der ersten Ebene inkl. aller Subordner...
- es fehlt eben nur noch die Gesamtzahl aller Dateien im angegebenen gcsfolder und darunter
s.o. Ich gehe davon aus das du den "Reisen-Ordner" angibst und für alle Ordner der ersten Ebene die Gesamtanzahl inkl. deren Unterordner ermittelt wird. Du gibst also an E:\DigiBilder\Reisen
Ansonsten musst du das gewünschte besser Erläutern ....
- und der verkürzte Ordner-Link (statt E:\DigiBilder\Reisen\USA\California\Los Angeles --> Reisen\USA\California\Los
Angeles wenn man bei DigiBilder das Script 'startet'.)
Das lässt sich mit einem einfachen replace zwischen Zeile 10 und 11 machen ....
strSubFolders = Replace(strSubfolders,"E:\DigiBilder\","",1,-1,1)  
Member: Gurkenhobel
Gurkenhobel Jan 20, 2015 at 19:27:52 (UTC)
Goto Top
Ja so siehts aus, aber ich hätte gern die Summe ALLER Dateien ausgehend vom Startordner Digitale Bilder\Reisen,
also in diesem Falle 8+5+16+15+24 also 68
 Start: C:\Digitale Bilder\Reisen

Ordner: C:\Digitale Bilder\Reisen\Faröer
Gesamtanzahl Dateien : 8
C:\Digitale Bilder\Reisen\Faröer : 8

------------------------
Ordner: C:\Digitale Bilder\Reisen\Island
Gesamtanzahl Dateien : 5
C:\Digitale Bilder\Reisen\Island : 5

------------------------
Ordner: C:\Digitale Bilder\Reisen\Kanada
Gesamtanzahl Dateien : 16
C:\Digitale Bilder\Reisen\Kanada : 0
C:\Digitale Bilder\Reisen\Kanada\Alberta : 3
C:\Digitale Bilder\Reisen\Kanada\Saskatchewan : 13

------------------------
Ordner: C:\Digitale Bilder\Reisen\Malta
Gesamtanzahl Dateien : 16
C:\Digitale Bilder\Reisen\Malta : 15

------------------------
Ordner: C:\Digitale Bilder\Reisen\USA
Gesamtanzahl Dateien : 24
C:\Digitale Bilder\Reisen\USA : 0
C:\Digitale Bilder\Reisen\USA\California : 0
C:\Digitale Bilder\Reisen\USA\California\Los Angeles : 3
C:\Digitale Bilder\Reisen\USA\California\National Parks : 5
C:\Digitale Bilder\Reisen\USA\California\San Francisco : 6
C:\Digitale Bilder\Reisen\USA\Colorado : 5
C:\Digitale Bilder\Reisen\USA\Nebraska : 2
C:\Digitale Bilder\Reisen\USA\Wyoming : 3

Melde mich morgen wieder - muss auf Arbeit...
Schön' abend noch, M.
Mitglied: 114757
114757 Jan 21, 2015 updated at 08:13:58 (UTC)
Goto Top
Das ist doch Kinderkacke, einfach in der ersten Schleife eine weitere Variable für den Total-Zähler hernehmen die die Variable folderCount bei jedem Durchlauf hinzuaddiert, und dann nach der Schleife in die Datei schreibt. Feddich ...
Member: Gurkenhobel
Gurkenhobel Jan 21, 2015 at 18:42:39 (UTC)
Goto Top
Hi,
die Gindergacke wurde ein gedämpft und nach Experimentieren habe ich nun folgendes Endscript, das mir unabhängig vom Startordner die Unterordner im gewünschten Layout zeigt.
strLogFile=date & "_log.txt"  
Dim goFso, gcsFolder, subfolder,objFile
Set goFso = CreateObject("Scripting.FileSystemObject")  
' set gcsFolder = goFso.GetFolder("C:\Digitale Bilder\Reisen\")  
Startordner=InputBox("Geben Sie den Pfad ein ! ")  
set gcsFolder = goFso.GetFolder(Startordner) 
Set objFile = goFso.CreateTextFile(strLogFile)
objFile.WriteLine("Start: ") & gcsFolder & vbNewLine  
 Zaehler = 0

For Each subfolder In gcsFolder.SubFolders
	folderCount = 0
     
	strSubFolders = ""  
	CountFiles subfolder
      '    strSubFolders = Replace(strSubfolders,"C:\Digitale Bilder\Reisen"," ",1,-1,1) ' Originalvorschlag  
          strSubFolders1 = Replace(strSubfolders,gcsFolder," ",1,-1,1) ' entfernt Startordner  
      '    strSubFolders2 = Replace(strSubfolders1,"\","",1,1,1) 'entfernt führenden Backslash  

	objFile.WriteLine "Ordner: " & subfolder.Path  
	objFile.WriteLine " Gesamtanzahl Dateien : " & folderCount  
	objFile.WriteLine strSubFolders1
	objFile.WriteLine "------------------------"  
Zaehler = Zaehler + foldercount
Next
objFile.WriteLine "Insgesamt " & Zaehler & " Dateien im Ordner """ & Startordner & """ und darunter."  
strSubFolders = Replace(strSubfolders,"\"," ",1,1,1) 'entfernt führende Backslash   
objFile.Close
MsgBox "Feddich " & Zaehler & " Dateien gezählt"  
set gcsFolder = nothing
Set goFso = Nothing
Set objFile = Nothing

Sub CountFiles(folder)
	On Error Resume Next
  Pfad=folder.path 
  folderCount = folderCount + folder.files.count

  If Instr(2,Pfad,":\",1) then  
   Pfad = " " & Right(Pfad,Len(Pfad)-Len(gcsFolder)-1) ' entfernt den Pfad des Startordners  
  else
  end if

   strSubFolders = strSubFolders & Pfad & " : " & folder.files.count & vbNewLine  
   For Each sSubFolder In folder.SubFolders
    CountFiles sSubFolder
   Next
End Sub
Siehst Du da etwaige Verbesserungen ?
Danke, schönen Abend noch und Tschüs, M.