gurkenhobel
Goto Top

VBS - Script für alle Dateien eines Ordners ausführen

Ich habe ein Script erstellt, daß bestimmte Textteile (Zeilen) einer .JSP-Datei in eine .HTML-Datei umwandelt, aber ich kann eben immer nur einen Dateinamen über die Inputbox eingeben zur Verarbeitung. Wie lässt sich dies für einen ganzen Ordner bzw. dessen Unterordner automatisieren?

Bisher bin ich bei all meinen Versuchen ziemlich verzweifelt und benötige Eure Hilfe. Zunächst einnmal die Konvertierungsdatei JSPinHTML.VBS:
 Const searchStr = "<tr>"  
 inPath=Inputbox("Name der Datei","JSP zu HTML konvertieren","410.jsp")  
 outPath=Left(inPath,3) & ".html" ' im aktuellen Ordner  

 With CreateObject("Scripting.FileSystemObject")  
  Set Quelldatei = .OpenTextFile(inPath)
  Set Zieldatei = .OpenTextFile(outPath, 2, True)
 End With

 Zieldatei.WriteLine "<html><body><table border=1><TH colspan=4>"  
  Do Until Quelldatei.AtEndOfStream
  Zeile = Trim(Quelldatei.ReadLine)
   
  If Left(Zeile, 66) = "<tr><td class=firstleft><a class=nowrap name=""zur&uuml;ck1"" href=#" Then  
   Zieldatei.WriteLine Zeile ' vbNewLine & Zeile  

  Elseif Instr(1,"Gemeinde*", Zeile) then  
   Zieldatei.WriteLine Zeile

  ElseIf Left(Zeile, 34) = "<b>Gemeindestatistik 2011 f&uuml;r" Then  
   Zieldatei.WriteLine Zeile

  ElseIf Left(Zeile, 30) = "(Amtlicher Gemeindeschlüssel =" Then  
   Zieldatei.WriteLine Zeile & "</TH>"  

   ' ... es folgen noch einige ElseIf-Blöcke  

  ElseIf Left(Zeile, 27) = "<tr><td class=firstleft>von" Then  
   Zieldatei.WriteLine Zeile

  End if
  End if

 Loop

Zieldatei.Writeline "</table></body></html>"  

Quelldatei.Close
Zieldatei.Close

Nun habe ich diesen Code etwas abgewandelt als Sub-Prozedur in ein neues Script eingefügt, aber es werden mir laufend Fehler präsentiert. Die Zuordnung der Dateien stimmt nicht. Hier der nicht lauffähige Code

Dim FSO, Ordner, Datei
Dim strFolder
Const ForReading = 1, ForWriting = 2, ForAppending = 8
strFolder = ".\"   ' aktueller Ordner  
Set FSO = CreateObject("Scripting.FileSystemObject")  
set Ordner = FSO.GetFolder(strFolder)

For Each Datei In Ordner.Files
 If LCase(FSO.GetExtensionName(Datei.Path)) = "jsp" Then  
  JSPinHTML(Ordner)  ' Subroutine  
 Else
 End If
Next

Set Ordner = Nothing
Set FSO = Nothing
' Liest Textzeilen aus *.jsp-Dateien  

Sub JSPinHTML(strOrdner) ' oder als FUNCTION ??  
Const searchStr = "<tr>"  
inpath=strOrdner
outPath=Left(inpath,3) & ".html"  <------- Syntaxfehler  

With CreateObject("Scripting.FileSystemObject")  
 Set Quelldatei = .OpenTextFile(inPath)
 Set Zieldatei = .OpenTextFile(outPath, 2, True)
End With

 Zieldatei.WriteLine "<html><body><table border=1><TH colspan=4>"  
  Do Until Quelldatei.AtEndOfStream
  Zeile = Trim(Quelldatei.ReadLine)
   
  If Left(Zeile, 66) = "<tr><td class=firstleft><a class=nowrap name=""zur&uuml;ck1"" href=#" Then  
   Zieldatei.WriteLine Zeile ' vbNewLine & Zeile  

  Elseif Instr(1,"Gemeinde*", Zeile) then  
   Zieldatei.WriteLine Zeile

  ElseIf Left(Zeile, 34) = "<b>Gemeindestatistik 2011 f&uuml;r" Then  
   Zieldatei.WriteLine Zeile

  ElseIf Left(Zeile, 30) = "(Amtlicher Gemeindeschlüssel =" Then  
   Zieldatei.WriteLine Zeile & "</TH>"  

   ' ... es folgen noch einige ElseIf-Blöcke  

  ElseIf Left(Zeile, 27) = "<tr><td class=firstleft>von" Then  
   Zieldatei.WriteLine Zeile

  End if
  End if

 Loop

Zieldatei.Writeline "</table></body></html>"  

Quelldatei.Close
Zieldatei.Close
End Sub

Das Script läuft immer im aktuellen Ordner, es erscheint mir günstiger, wenn ich es von Ordner zu Ordner kopiere, als wenn ich jedesmal das Script anpassen muss. Alternativ könnten man aber auch die Verarbeitung in ALLEN UNTERORDNERN vornehmen, denn die JSP-Dateien liegen parallel unter einem Parent Folder.

Ich freu' mich schon auf Antworten und danke im voraus.

Micha:

Content-Key: 187869

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

Printed on: April 23, 2024 at 08:04 o'clock

Member: rubberman
rubberman Jul 11, 2012 updated at 23:48:23 (UTC)
Goto Top
Hallo Micha,

so könnte die Routine für das rekursive Durchsuchen nach *.jsp Dateien aussehen:
Set objFSO = CreateObject("Scripting.FileSystemObject")  
GetJspFiles(objFSO.GetParentFolderName(WScript.ScriptFullName))
Set objFSO = Nothing


Sub GetJspFiles(strFolderName)
  If objFSO.FolderExists(strFolderName) Then
    Set objFolder = objFSO.GetFolder(strFolderName)
    On Error Resume Next
    For Each objFile In objFolder.Files
      If LCase(objFSO.GetExtensionName(objFile.Name)) = "jsp" Then  
        ' Statt dem "WScript.Echo" solltest du hier die Subroutine  
        '  für die HTML Dateien aufrufen.   
        WScript.Echo objFile.Path
      End If
    Next
    For Each objSubFolder In objFolder.SubFolders
      GetJspFiles(objSubFolder.Path)
    Next
    On Error Goto 0
  End If
End Sub

Grüße
rubberman
Member: Gurkenhobel
Gurkenhobel Jul 12, 2012 at 06:54:45 (UTC)
Goto Top
Hi Rubberman,
danke für Deine mitternächtliche Antwort. Ich habe die Zeile 14 Deines Scripts durch
JSPinHTML objFile.Path
ersetzt und unten die Subroutine JSPinHTML angehängt.
Ich bekomme aber immer nur eine generierte Datei FALSE mit dem Inhalt
<html><body><table border=1><TH colspan=4>
also der Zeile 14 meines ersten Scripts. Wahrscheinlich muss der Anfang der Subroutine HSPinHTML umgebaut werden.
Ich bin Grünfink, habe noch nicht allzuviel Ahnung wie man das bewerkstelligen könnte. Die Auflistung der JSP-Dateien mit
 Wscript.Echo objFile.Path
funktioniert ja gut.

vy73 Micha
Mitglied: 76109
76109 Jul 12, 2012 at 11:01:49 (UTC)
Goto Top
Hallo Micha!

Versuchs mal hiermit:
    Dim objFso, strFolder

'Main Beg  
    Set objFso = CreateObject("Scripting.FileSystemObject")  
    
    strFolder = objFso.GetParentFolderName(WScript.ScriptFullName)
    
    If objFso.FolderExists(strFolder) Then
        Call GetJspFiles(objFso.GetFolder(strFolder))
    End If
    
    Set objFso = Nothing
'Main End  


Sub GetJspFiles(ByRef objFolder)
    Dim objFile, objSubFolder
    
    For Each objFile In objFolder.Files
        If LCase(objFso.GetExtensionName(objFile.Name)) =  "jsp" Then  
            Call JSPinHTML(objFile.Path, objFolder.Path)
        End If
    Next
    
    For Each objSubFolder In objFolder.SubFolders
      Call GetJspFiles(objSubFolder)
    Next
End Sub


Sub JSPinHTML(ByRef strPath, ByRef strFolder)
    Dim arrText, strText, strTextLine, strHtmlPath, objJspFile, objHtmlFile
    
    strHtmlPath = objFso.BuildPath(strFolder, objFso.GetBaseName(strPath) & ".html")  
    
    Set objJspFile = objFso.OpenTextFile(strPath)
    Set objHtmlFile = objFso.CreateTextFile(strHtmlPath)
    
    arrText = Split(objJspFile.ReadAll, vbCrLf)
     
    objHtmlFile.Writeline "<html><body><table border=1><TH colspan=4>"  
      
    For Each strTextLine In arrText
        If strTextLine <> "" Then  
            strText = Trim(strTextLine)
               
            With objHtmlFile
                If Left(strText, 66) = "<tr><td class=firstleft><a class=nowrap name=""zurück1"" href=#" Then  
                    .Writeline strText
                ElseIf InStr(1, "Gemeinde*", strText) Then  
                    .Writeline strText
                ElseIf Left(strText, 34) = "<b>Gemeindestatistik 2011 für" Then  
                    .Writeline strText
                ElseIf Left(strText, 30) = "(Amtlicher Gemeindeschlüssel =" Then  
                    .Writeline strText & "</TH>"  
                ElseIf Left(strText, 27) = "<tr><td class=firstleft>von" Then  
                    .Writeline strText
                End If
            End With
        End If
    Next
    
    objHtmlFile.Writeline "</table></body></html>"  
    
    objJspFile.Close
    objHtmlFile.Close
End Sub

Gruß Dieter
Member: Gurkenhobel
Gurkenhobel Jul 12, 2012 at 13:20:05 (UTC)
Goto Top
Hi Dieter,
Härrlisch - so habe ich mir das vorgestellt. Das Skript lief wunderbar reibungslos und alles wurde zur vollsten Zufriedenheit generiert. Das Grundgerüst mit dem rekursiven Bearbeiten ist sehr wertvoll als weitere Vorlage für ähnliche Projekte. Auf jeden Fall HERZLICHEN DANK.

vy73 Micha
Mitglied: 76109
76109 Jul 12, 2012 updated at 15:25:22 (UTC)
Goto Top
Hallo Micha!

Jepp, gern geschehenface-wink

Fehlt eigentlich nur noch so'n grüner Hakenface-wink

Gruß Dieter
Member: Gurkenhobel
Gurkenhobel Jul 12, 2012 at 17:59:42 (UTC)
Goto Top
Hallo Dieter,
ich hab das Script umgestellt auf die Instr-Funktion (ist für mich sicherer). Allerdings kommt jetzt bei Zeile 37
Set objHtmlFile = objFso.CreateTextFile(strHtmlPath)
ein Laufzeitfehler 46: Erlaubnis verweigert. Könnte da noch eine Datei offen sein ? Ansonsten geht das Script auch.
Wegen dem grünen Haken muß ich schnell noch mal zum Baumarkt, bevor er 20.00 schließt
Member: rubberman
rubberman Jul 12, 2012 at 21:55:26 (UTC)
Goto Top
Hallo Zusammen!

@Dieter
Gleich das Folder Objekt zu referenzieren gefällt mir besser. Daumen hoch face-smile

@Micha
Wie und für was setzt du InStr() ein? Bring mal ein paar Codezeilen.

Grüße
rubberman
Mitglied: 76109
76109 Jul 12, 2012 at 23:00:10 (UTC)
Goto Top
Hallo rubberman!

Gleich das Folder Objekt zu referenzieren gefällt mir besser. Daumen hoch
Freu mich, dass Dir das gefälltface-smile

Grüße und gute Nacht

Dieter
Member: Gurkenhobel
Gurkenhobel Jul 13, 2012 at 05:30:43 (UTC)
Goto Top
Guten Morgen
Zitat von @rubberman:

@Micha
Wie und für was setzt du InStr() ein? Bring mal ein paar Codezeilen.
Ja wie gewünscht ein paar Codeschnipsel aus dem Inneren des Scripts
... 
 Elseif Instr(1,strText, "che</a> am 31.12",1) Then  
       .WriteLine strText   ' Fläche  
 ElseIf Instr(1, strText,"href=#32>Zuz",1) Then  
       .WriteLine strText   'Zuzüge  
 ElseIf Instr(1, strText,"href=#32>Fortz",1) Then  
       .WriteLine strText   ' Fortzüge  
ElseIf Instr(1, strText,"href=#Th3>Erwerbst",1) Then  
       .WriteLine vbNewLine & "<tr><td colspan=4>< ab hier nichts&nbsp;mehr ></td></tr>"  
...

Einsatzweck: Auslesen der gesuchten Zeilen und Schreiben in die HTML-Datei in der gleichen Reihenfolge wie in der Quelldatei. Statistikdatei.

vy73 Micha
Member: rubberman
rubberman Jul 13, 2012 at 17:03:41 (UTC)
Goto Top
Hallo Micha.

OK, das erklärt irgendwie nicht den Laufzeitfehler. Da muss was anderes im Argen sein. Per Ferndiagnose kriege ich das aber auch nicht raus face-sad

Grüße
rubberman
Member: Gurkenhobel
Gurkenhobel Jul 13, 2012 updated at 18:21:33 (UTC)
Goto Top
Hi rubberman,
da ist etwas ganz unerklärliches passiert. Ich habe als zweite Zeile 'On Error Resume Next' hereingenommen. Da kam natürlich keinerlei Fehlermeldung und die Dateien wurden ordentlich geschrieben. Dann habe ich diese Zeile wieder auskommentiert und die Meldung blieb ebenfalls weg. face-devilish

Nun habe ich noch ein anderes Ploblem.

Und zwar habe ich didi's Konzept genommen und mir ein Script gebastelt, das jede Datei umbenennt. Und zwar in eine Schlüsselnummer (AGS), die in jeder Datei vorliegt und daraus ausgelesen wird (Zeile 43 bis 45). So soll also aus 210.jsp 14251210.jsp werden. Das bringt mir mehr Übersicht.

Mit dem Script bin ich fast bis ans Ende angelangt, nur will er mir den aktuellen (alten) Dateinamen nicht anzeigen (in Zeile 56). Ich habe schon alle Varianten ausprobiert, aber es kommen immer Fehler oder leere Strings. Hier ist einmal der Code zum Anschauen:
    Dim objFso, strFolder

' Beginn Hauptprogramm  

    Set objFso = CreateObject("Scripting.FileSystemObject")  
    strFolder = objFso.GetParentFolderName(WScript.ScriptFullName) ' nur der Ordnername  
    
    If objFso.FolderExists(strFolder) Then
        Call GetJspFiles(objFso.GetFolder(strFolder))
    End If
    
    Set objFso = Nothing

' Ende Hauptprogramm  

Sub GetJspFiles(ByRef objFolder)
    Dim objFile, objSubFolder
    
    For Each objFile In objFolder.Files
        If LCase(objFso.GetExtensionName(objFile.Name)) = "jsp" Then  
            Call JSPRename(objFile.Path, objFolder.Path)
        End If
    Next
    
    For Each objSubFolder In objFolder.SubFolders
      Call GetJSPRename(objSubFolder)
    Next
' objFile.Close  

End Sub

Sub JSPRename(ByRef strPath, ByRef strFolder)
    Dim arrText, strText, strTextLine, Position , objJspFile, newFilename, strVerz
    
    Set objJspFile = objFso.OpenTextFile(strPath)
    
    arrText = Split(objJspFile.ReadAll, vbCrLf) ' In Zeilen Splitten  
     
    For Each strTextLine In arrText
      If strTextLine <> "" Then  
         strText = Trim(strTextLine)

       If Instr(1,strText,"(Amtlicher Gemeindeschlüssel",1) Then  
        Position=Instr(1, strText, "(Amtlicher Gemeindeschlüssel =",1)  
       newFilename=mid(strText,Position+31, 8)
     
       else
       end if
      end if

    Next

' objFile.Close ' deaktiviert wegen Zeile 28  

 strVerz=objFSO.GetParentFoldername(WScript.ScriptFullName) ' nutzlose Hilfszuordnung ?  
 strNewName = strVerz & "\" & newFilename & ".jsp"   

 Wscript.echo strNewName & vbcrlf & strVerz.files ' ??GetAbsolutePathname(strFolder) / objFile.Path??  
  
 ' objFSO.MoveFile strVerz.files, strNewName  
 ' erst aktivieren, wenn Wscript.echo in der 50. Zeile den alten Dateinamen zeigt  

 
  objJspFile.Close

End Sub

Was muss also in der Zeile 56 und 60 anstelle von strVerz angegeben werden, damit WScript.Echo den neuen und den alten Dateinamen anzeigt. Danach kann man die Zeile 60 wieder aktivieren.
Mitglied: 76109
76109 Jul 13, 2012 updated at 18:19:42 (UTC)
Goto Top
Hallo Gurkenhobel!

Also, bitte Codezeile 28 ersatzlos streichenface-wink

Da gibt es nichts zum Schließen??????????

Und auf was soll sich die Codezeile 53 beziehen???????

Auf was soll sich das objFile in Deinem unteren Codeteil überhaupt beziehen?????????


Gruß Dieter
Member: Gurkenhobel
Gurkenhobel Jul 13, 2012 at 18:26:15 (UTC)
Goto Top
Hi Dieter,
die Codezeile 28 war ja schon deaktiviert. Bei Zeile 53 hatte er rumgemeckert, dass muss irgendwie beim Codereinkpieren mit reingerutscht sein.
Jetzt meckert er bei Zeile 56: Objekt erforderlich: strVerz. Ich weiß wirklich nicht, was da rein soll.
Grüße Micha:
Member: Gurkenhobel
Gurkenhobel Jul 16, 2012 updated at 18:25:35 (UTC)
Goto Top
Hallo,
mit einer Stringmanipulation habe ich das Script zum Laufen bekommen. Hier ist der zu ersetzende Code ab Zeile 51.
 Next

 objJspFile.Close

  cutme=Left(strPath, InStrRev(strPath,"\")-1)   
  strNewName = cutme & "\" & newFilename & ".jsp"  
  ' Wscript.echo "Old Filename: " & strPath & vbcrlf & vbcrlf & "New Filename: " & strNewName  
  ' Testanzeige  
  objFSO.MoveFile strPath, strNewName

End Sub
.
Zu beachten war außerdem, daß objJspFile erst geschlossen werden musste, ehe es sich umbenennen lies. Danke und Grüße an alle die mir geholfen haben.........
Micha
Mitglied: 76109
76109 Jul 16, 2012 updated at 21:42:19 (UTC)
Goto Top
Hallo Micha!

Dann eher so:
Sub GetJspFiles(ByRef objFolder)
    Dim objFile, objSubFolder
    
    For Each objFile In objFolder.Files
        If LCase(objFso.GetExtensionName(objFile.Name)) = "jsp" Then  
            Call JSPRename(objFile)
        End If
    Next
    
    For Each objSubFolder In objFolder.SubFolders
      Call GetJspFiles(objSubFolder)  'Hier nix verändern!!!  
    Next
End Sub

Sub JSPRename(ByRef objFile)
    Dim arrText, strText, strTextLine, objJspFile, intPosition
    
    Set objJspFile = objFso.OpenTextFile(objFile.Path)
    
    arrText = Split(objJspFile.ReadAll, vbCrLf):   objJspFile.Close
    
    For Each strTextLine In arrText
        If strTextLine <> "" Then  
            strText = Trim(strTextLine)

            intPosition = InStr(1, strText, "(Amtlicher Gemeindeschlüssel", vbTextCompare) + 31  
            
            If intPosition > 31 Then
                objFile.Name = Mid(strText, intPosition, 8) & ".jsp"  
            End If
        End If
    Next
End Sub

Gruß Dieter
Member: Gurkenhobel
Gurkenhobel Jul 17, 2012 at 12:30:41 (UTC)
Goto Top
Ja, ein verkürztes Script, aber es arbeitet nicht - überhaupt keine Dateinamenänderung.
objFSO.MoveFile war glaub' ich die bessere Wahl

Gruß Micha
Mitglied: 76109
76109 Jul 17, 2012 at 13:28:30 (UTC)
Goto Top
Hallo Micha!

Eine Datei umzubenennen halte ich durchaus für die bessere Lösung und funktioniert bei mir auch einwandfrei.

Hast Du den Code auch komplett kopiert?

Gruß Dieter
Member: Gurkenhobel
Gurkenhobel Jul 17, 2012 updated at 17:57:48 (UTC)
Goto Top
Hallo Dieter,

ist schon irgendwie komisch. Habe auf Zeile 27 eingefügt WScript.echo "Zeile: " & strText (das mache ich desöfteren zur Prüfung) und getestet - Null Reaktion - keine Anzeige.

JETZT KOMMTS Dann habe in Codezeile 3 Deines Scripts geschrieben WScript.Echo "Code von Dieter" Ergebnis: KEIN FENSTER - keine Reaktion. Ebensowenig wie bei MsgBox "....

Was ist denn da los. Mein Script läuft komischerweise - auch bei kurzen Test-JSP-Dateien mit eingefügter Zeile "Amtlicher Gemeindeschlüssel = 14777999" oder "1477888" usw.

Zur Sicherheit habe ich den Code nochmals kopiert...

Gruß Micha
Mitglied: 76109
76109 Jul 17, 2012 updated at 18:21:56 (UTC)
Goto Top
Hallo Micha!

Hm, hast Du auch den oberen Codeteil mit drinnen?
    Dim objFso, strFolder

' Beginn Hauptprogramm  

    Set objFso = CreateObject("Scripting.FileSystemObject")  
    strFolder = objFso.GetParentFolderName(WScript.ScriptFullName) ' nur der Ordnername  
    
    If objFso.FolderExists(strFolder) Then
        Call GetJspFiles(objFso.GetFolder(strFolder))
    End If
    
    Set objFso = Nothing

' Ende Hauptprogramm  

Gruß Dieter

PS.
Was ist denn da los. Mein Script läuft komischerweise - auch bei kurzen Test-JSP-Dateien
mit eingefügter Zeile "Amtlicher Gemeindeschlüssel = 14777999" oder "1477888" usw.
Da fehlt noch die Klammer an Position 1:
"(Amtlicher Gemeindeschlüssel"
Member: Gurkenhobel
Gurkenhobel Jul 17, 2012 at 18:41:49 (UTC)
Goto Top
Zitat von @76109:
Hallo Micha!

Hm, hast Du auch den oberen Codeteil mit drinnen?

Natürlich nicht - total übersehen. Jetzt läuft der Code einwandfrei.

Da fehlt noch die Klammer an Position 1:
"(Amtlicher Gemeindeschlüssel"

Ja, das hatte ich nur hier im Codetext vergessen.

Herzlichen Dank für die viele Mühe, die DU mit mir hattest und noch einen schönen Abend.

Micha
Mitglied: 76109
76109 Jul 17, 2012 at 19:12:54 (UTC)
Goto Top
Hallo Micha!

Hm, hast Du auch den oberen Codeteil mit drinnen?
Natürlich nicht - total übersehen. Jetzt läuft der Code einwandfrei.
Hab ich's mir doch gedachtface-smile

Herzlichen Dank für die viele Mühe, die DU mit mir hattest und noch einen schönen Abend.
Jepp, gern geschehen und auch Dir noch einen schönen Abend

Dieter