VB Script - Unterordner und Datei erstellen

aleXandroW

Level-2
Beiträge
59
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

ich möchte einen Ordner mit Unterordner erstellen und dort Eine CSV Datei. Es klappt auch fast. Beim ausführen des Scriptes erstellt er die Ordner aber es kommt der Fehler " Fehler 53 die Datei wurde nicht gefunden". Wenn ich das Script das zweite mal ausführe ist alles in Ordnung.

Code:

Code:
jahr = Year(Now)
monat = MonthName(Month(Now))

ordner = "C:\Users\HundH\Documents\Tagesverbrauch" & jahr & "" & monat 
datei="C:\Users\HundH\Documents\Tagesverbrauch" & jahr & "" & monat & "" & Date & ".csv"


    'Catch errors -- Fehler abfangen
    On Error Resume Next

    'Create object -- Objekt erstellen
    Set fso = CreateObject("Scripting.FileSystemObject")

        If Err.Number <> 0 Then
            ShowSystemAlarm "Error #" & CStr(Err.Number) & " " & Err.Description
            Err.Clear
            Exit Sub
    End If
    
    ' If no Folder exists, create a new one -– Ordner erstellen, wenn keines vorhanden
    If Not fso.FolderExists(ordner) Then
        'fso.CreateFolder ordner
        Set objShell = CreateObject("WScript.Shell") 
        objShell.Run("cmd.exe /C mkdir " & ordner )
    End If
    
    ' If no file exists, create a new one -– Datei erstellen, wenn keine vorhanden
    If Not fso.FileExists(datei) Then
        fso.CreateTextFile datei
    End If

    Set f = fso.GetFile(datei)
    If Err.Number <> 0 Then
        ShowSystemAlarm "Error #" & CStr(Err.Number) & " " & Err.Description
        Err.Clear
        Exit Sub
    End If

    Set ts = f.OpenAsTextStream(2, -2)
    ' mode "8" to append to file
    If Err.Number <> 0 Then
        ShowSystemAlarm "Error #" & CStr(Err.Number) & " " & Err.Description
        Err.Clear
        Exit Sub
    End If

Wo ist der Fehler?

Danke für die Hilfe
 
Zuletzt bearbeitet:
Vermutlich mußt Du zwischen dem Aufruf des cmd.exe und dem nachfolgenden fso.FileExists ein Weilchen (~ 1s) warten.
Warum erstellst Du den Ordner nicht mit fso.CreateFolder?

Harald
 
Du kannst mit CreateFolder nicht eine ganze Ordnerstruktur auf einen Schlag erstellen (das kann nur .Net in seinem Framework) sondern erst Haupt-Ordner, dann Unter-Ordner im Haupt-Ordner und dann Unter-Unter-Ordner in Haupt-Ordner\Unter-Ordner.
Den CMD-Befehl solltest du dir verkneifen wo immer du es kannst. Immer am Besten mit eingelagerten befehlen arbeiten ...

Gruß
Larry
 
Mit fso.CreateFolder spuckt er Fehler aus wegen den Unterordnern. Kenne die Synthax dafür nicht.
Unterordner müssen Schritt für Schritt erzeugt werden, z.B.
Code:
fso.CreateFolder "C:\Users"
fso.CreateFolder "C:\Users\HundH"
fso.CreateFolder "C:\Users\HundH\Documents"
fso.CreateFolder "C:\Users\HundH\Documents\Tagesverbrauch"


Wie kann ich da eine Wartezeit einbauen?
Code:
[COLOR="#008000"]' If no Folder exists, create a new one -– Ordner erstellen, wenn keines vorhanden[/COLOR]
If Not fso.FolderExists(ordner) Then
  [COLOR="#008000"]'fso.CreateFolder ordner[/COLOR]
  Set objShell = CreateObject("WScript.Shell")
  objShell.Run("cmd.exe /C mkdir " & ordner )

  breaktime = Now + #00:00:02#  [COLOR="#008000"]'TimeSerial(0, 0, 2) 'max bis Jetzt+2 Sekunden warten[/COLOR]
  Do While Not fso.FolderExists(ordner)
    If (Now > breaktime) Then Exit Sub  [COLOR="#008000"]'Notausgang bei Überschreitung Wartezeit[/COLOR]
  Loop
End If

PS: kann es sein, daß man bei dem Aufruf des CMD ganz kurz das CMD-Fenster aufflackern sieht? Unschön.

Harald
 
Ok. Das funktioniert jetzt mit Ordner nacheinander erstellen.

Jetzt habe ich noch ein kleines Problem. Ich möchte gerne in der CSV Datei die Überschriften erstellen und danach die Werte nacheinander einfügen. Sprich die Überschrift bleibt immer bestehen und die Werte werden hinzugefügt.
Ich arbeite mit einer PC Runtime. Mein Code klappt noch nicht ganz.

Code:
Code:
If Not fso.FileExists(datei) Then
        fso.CreateTextFile datei
        
        breaktime = Now + #00:00:02#
        
        Do While Not fso.FolderExists(ordner)
            If (Now > breaktime) Then Exit Sub  'Notausgang bei Überschreitung Wartezeit
        Loop
        
        Set f = fso.GetFile(datei)
        If Err.Number <> 0 Then
            ShowSystemAlarm "Error #" & CStr(Err.Number) & " " & Err.Description
            Err.Clear
            Exit Sub
        End If

        Set ts = f.OpenAsTextStream(8, -2)
        ' mode "8" to append to file
        ' mode "2" to overwriting file
        If Err.Number <> 0 Then
            ShowSystemAlarm "Error #" & CStr(Err.Number) & " " & Err.Description
            Err.Clear
            Exit Sub
        End If
        
        ts.WriteLine "Datum: " & Date
        ts.WriteLine
        ts.WriteLine "Zeit" & semi & "Rezept" & semi & "Menge"
        ts.WriteLine
         ts.WriteLine uhrzeit_start & " - " & uhrzeit_ende &  semi & SmartTags("DB_HMI_STRING_BEARBEITETES_REZEPT") & semi  & SmartTags("m_formzaehler")
        f.Close
    End If
    
    
    If  fso.FileExists(datei) Then
        Set f = fso.GetFile(datei)
        If Err.Number <> 0 Then
            ShowSystemAlarm "Error #" & CStr(Err.Number) & " " & Err.Description
            Err.Clear
            Exit Sub
        End If

        Set ts = f.OpenAsTextStream(8, -2)
        ' mode "8" to append to file
        ' mode "2" to overwriting file
        If Err.Number <> 0 Then
            ShowSystemAlarm "Error #" & CStr(Err.Number) & " " & Err.Description
            Err.Clear
            Exit Sub
        End If
        
        ts.WriteLine "test"
    End If    
    
    
    'Tidy up -- Aufraeumen
    f.Close
    Set ts = Nothing
    Set f = Nothing
    Set fso = Nothing
    ShowSystemAlarm "Storage of the data was successful!"
 
Zuletzt bearbeitet:
Mein Code klappt noch nicht ganz.
Dein Code sieht so aus als würdest Du das allererste Mal mit VBS Dateien schreiben.
Halte Dich mal an folgendes Grundgerüst:
Code:
'VBS für Windows
'Grundgerüst Datensätze schreiben in csv-Datei

Dim fso, f, t, jahr, monat, datum, cdatum, cuhrzeit, ordner, datei

t = Now  'Uhrzeit einmalig erfragen
jahr  = DatePart("yyyy", t)  ' "2016"
monat = Right("0" & DatePart("m", t), 2) & "_" & MonthName(Month(t))  ' "01_Januar"
datum = DatePart("yyyy", t) & Right("0" & DatePart("m", t), 2) & Right("0" & DatePart("d", t), 2)  ' "20160128"

cdatum   = Right("0" & DatePart("d", t), 2) & "." & Right("0" & DatePart("m", t), 2) & "." & DatePart("yyyy", t)  ' "28.01.2016"
cuhrzeit = Right("0" & DatePart("h", t), 2) & ":" & Right("0" & DatePart("n", t), 2) & ":" & Right("0" & DatePart("s", t), 2)  ' "17:06:00"

ordner = "C:\TEMP\Tagesverbrauch_" & jahr & "_" & monat  ' "...\Tagesverbrauch_2016_01_Januar"
datei  = ordner & "\" & datum & ".csv"

'*** Catch errors -- Fehler abfangen
On Error Resume Next

'*** Create object -- Filesystemobjekt erstellen
Set fso = CreateObject("Scripting.FileSystemObject")

If Err.Number <> 0 Then
  ShowSystemAlarm "Error #" & CStr(Err.Number) & " " & Err.Description
  Err.Clear
  Exit Sub
End If


'*** Ordner erstellen, wenn noch nicht vorhanden
If Not fso.FolderExists(ordner) Then
  fso.CreateFolder ordner  'Unterordner ggf in mehreren Schritten
End If

If Err.Number <> 0 Then
  ShowSystemAlarm "Error #" & CStr(Err.Number) & " " & Err.Description
  Err.Clear
  Exit Sub
End If


'*** Wenn Datei noch nicht vorhanden, dann neu anlegen und Kopfzeile schreiben
If Not fso.FileExists (datei) Then 
  Set f = fso.CreateTextFile(datei, True)
  f.WriteLine "Datum;Uhrzeit;MyVar_1;MyVar_2" 'Kopfzeile
  f.Close
End If

If Err.Number <> 0 Then
  ShowSystemAlarm "Error #" & CStr(Err.Number) & " " & Err.Description
  Err.Clear
  Exit Sub
End If

'*** csv-Datenzeile in Datei schreiben
' mode "8": append to file
If fso.FileExists (datei) Then
  Set f = fso.OpenTextFile(datei, 8)
  f.WriteLine Chr(34) & cdatum & Chr(34) & ";" & Chr(34) & cuhrzeit & Chr(34) & ";" _
              & SmartTags("MyVar_1") & ";" & SmartTags("MyVar_2")
  f.Close
End If

If Err.Number <> 0 Then
  ShowSystemAlarm "Error #" & CStr(Err.Number) & " " & Err.Description
  Err.Clear
  Exit Sub
End If

ShowSystemAlarm "csv-Daten erfolgreich geschrieben!"

Siehe auch mal FAQ: Protool/WinCCflex Daten lesen / schreiben mit VB-Script
und http://www.sps-forum.de/hmi/73704-w...vieren-aktualisierungszeit-der-variablen.html

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
@aleXandroW
In der unteren Icon-Reihe des Beitrageditors gibt's ganz rechts den Button #. Der erstellt die Code-Tags.
Wenn Du Deinen Programmauszug darin einbettest, wird er so besser hervorgehoben, wie Du es in Haralds Beitrag sehen kannst.

Wäre gut, wenn Du das auch noch in Deinen obigen Beiträgen nachholst, weil sie dann besser lesbar werden.
Einfach den Programmauszug markieren, Button drücken - fertig. :)
 
Zurück
Oben