TIA WinCC Comfort. Alle Dateien von eine Ordner nach andere Ordner kopieren.

Beiträge
8.854
Reaktionspunkte
2.138
Zuviel Werbung?
-> Hier kostenlos registrieren
TIA V15.1 und TP1200.

Ich will alle Dateien von eine Log-Ordner auf das SD Karte nach eine USB Stick kopieren.
Ich finde heirfür keine 'schöne' Verfahren.
Es sind nicht Archiv-Dateien, sondern .CSV Dateien die mittels VBS Skript erstellt sind.

Mit VBS habe ich versucht mit:
Code:
objfs.FileCopy str_full_path_SD, str_full_path
Aber scheinbar geht es nicht mit nur die Ordner-Namen. Mit .FileCopy muss man jeden Datei spezifizieren.

Ich habe eine Krücke erstellt mit eine .BAT Datei.
In diese .BAT Datei gibt es dise Einzeiler:
Code:
COPY "\Storage Card SD\LOG\*.*" "\Storage Card USB\LOG\"
Dies rufe ich auf eine Taster mittels den Systemfunktion StartProgram,
und die Parameter Display mode = Minimized und Wait for program to end = No
Das funktioniert !

Nur, es erscheint kurzlich eine Fenster (obwohl 'minimized').
Und ich wurde es gerne in eine VBS Skript einbauen, so dass ich es mit einige Prüfungen kombinieren kann (SD Karte gesteckt, Dateien vorhanden, USB Media gesteckt).
Wenn ich in mein Skript Versuche mit
Code:
StartProgram "\Storage Card SD\backup_logs.bat","",hmiShowMinimized,hmiNo
Dann bekomme ich eine Skript Fehler "Error starting the application: \Storage Card SD\backup_logs.bat, error code: 2.1"

Meine Fragen:
Gibt es eine einfachere mehr "korrekte" Verfahren um unter Windows CE alle Dateien von eine Ordner nach eine andere zu kopieren ?
Warum bekomme ich den Skript Fehler 2.1 ?
 
Zuletzt bearbeitet:
Moin,

ich weiß nicht mehr ob es so mal funktioniert hatte. Aber irgend wann musste ich das auch mal machen.

Versuche mal so
Code:
Dim sourceFolder

Dim targetFolder

' Pfade definieren
sourceFolder = "\Storage Card SD\Logs\"
targetFolder = "\Storage Card USB\Logs\"

objFSO.CopyFolder sourceFolder, targetFolder, True
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Aber scheinbar geht es nicht mit nur die Ordner-Namen. Mit .FileCopy muss man jeden Datei spezifizieren.
mit der Dir-Methode und einer Schleife kann man alle Dateinamen im Ordner ermitteln
siehe auch FAQ: WinCC Flex VBScript WinCe - Move *.* bzw. Dateien kopieren

Ich bin gerade nicht sicher, aber ich meine, die FileCopy-Methode unter WinCE unterstützt auch Wildcards * und ? in Dateinamen. Aber nicht das Pendant unter PC-Windows.
 
Ich habe es gefunden, so hatte ich es dann gemacht, kann sein das es auch einfacher geht, aber so hatte es bei mir jedenfalls zum Erfolg geführt.
In der Simulation hat es auf dem PC eben funktioniert

Code:
Dim objFSO
Set objFSO = CreateObject("Scripting.FileSystemObject")

Dim sourceFolder
Dim targetFolder

' Pfade definieren
sourceFolder = "\Storage Card SD\Logs\"
targetFolder = "\Storage Card USB\Logs\"



    ' Prüfen, ob der Quellordner existiert
    If objFSO.FolderExists(sourceFolder) Then
        If Not objFSO.FolderExists(targetFolder) Then
        
            objFSO.CreateFolder(targetFolder)
            
        End If   
        ' Dateien im Quellordner kopieren
        Dim file
        For Each file In objFSO.GetFolder(sourceFolder).Files
            objFSO.CopyFile file.Path, targetFolder & "\" & objFSO.GetFileName(file.Path), True
        Next

        ' Unterordner kopieren (falls vorhanden)
        Dim subFolder
        For Each subFolder In objFSO.GetFolder(sourceFolder).SubFolders
            ' Ziel-Unterordner erstellen, falls er noch nicht existiert
            If Not objFSO.FolderExists(targetFolder & "\" & subFolder.Name) Then
                objFSO.CreateFolder(targetFolder & "\" & subFolder.Name)
            End If
            
            ' Dateien im Unterordner kopieren
            For Each file In subFolder.Files
                objFSO.CopyFile file.Path, targetFolder & "\" & subFolder.Name & "\" & objFSO.GetFileName(file.Path), True
            Next
        Next
        
        ' Erfolgsmeldung ausgeben
        ShowSystemAlarm "Das Kopieren des Ordners '" & sourceFolder & "' nach '" & targetFolder & "' wurde erfolgreich abgeschlossen."
    Else
        ShowSystemAlarm "Der Quellordner '" & sourceFolder & "' existiert nicht."
    End If


' Objektspeicher freigeben
Set objFSO = Nothing
 
Zuerst danke für die Vorschläge !

Was das ganze schwieriger macht ist dass man den Code nicht auf sein PC testen kann. Mann muss es umständlich auf den Comfort Panel übertragen, HMI starten, die Funktion testen, die eventuelle Fehlermeldungen untersuchen, eine Korrektur machen und erneut übertragen usw.

Versuche mal so
Code:
Dim sourceFolder

Dim targetFolder

' Pfade definieren
sourceFolder = "\Storage Card SD\Logs\"
targetFolder = "\Storage Card USB\Logs\"

objFSO.CopyFolder sourceFolder, targetFolder, True
Laut die Liste von welche Controls unter Windows CE vorhanden sind, finde ich keine .CopyFolder.
Ich versuche aber und melde zurück.

mit der Dir-Methode und einer Schleife kann man alle Dateinamen im Ordner ermitteln
siehe auch FAQ: WinCC Flex VBScript WinCe - Move *.* bzw. Dateien kopieren
Ich studiere die Verfahren von @Dino und melde zurück.
Ich bin gerade nicht sicher, aber ich meine, die FileCopy-Methode unter WinCE unterstützt auch Wildcards * und ? in Dateinamen. Aber nicht das Pendant unter PC-Windows.
Ich habe probiert mit Wildcards, aber ohne Erfolg.
Ich mache noch ein Versuch, kann sein es ist eine Frage von den korrekten Format von die Parameter.

Ich habe es gefunden, so hatte ich es dann gemacht, kann sein das es auch einfacher geht, aber so hatte es bei mir jedenfalls zum Erfolg geführt.
In der Simulation hat es auf dem PC eben funktioniert
Die Code scheint für das Windows File System Object gemacht zu sein.
objFSO = CreateObject("Scripting.FileSystemObject") ist definitiv für normalen Windows.
Die .FolderExists und .GetFolder finde ich für Windows CE nicht.
.FolderExists kann man so machen:
Code:
'>>On Windows CE, check If folder exists
If objfs.dir(str_media & str_log_path)="" Then

Auf den Internet findet man wenig Dokumentation VBS Code unter Windows CE. Meistens landet man hier !
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hier ist die Lösung:
The Dir method returns the first file name that matches pathname. To get any additional file names
that match pathname, call Dir again with no parameters.
When no more file names match, Dir returns
a zero-length string (" "). Once a zero-length string is returned, you must specify pathname in
subsequent calls.
Also, wenn man mehrmals .Dir ruft, dann findet es jeden mal den nächsten Datei welche die Such-Parameter passt.
Und damit kann man die vollen Pfad-Strings erzeugen für die Quelle und Ziel welche .FileCopy benötigt.
In kurzen: rufe .Dir erste mal mit Such-Parameter, nächsten mal ohne Such-Paramter. Dies wird intepretiert als 'finde den nächsten Datei'.
 
Es funktioniert !
Ich habe den code von @PN/DP (ursprünglich von @Dino) angepasst.

Wenn es jemand interessiert. Unten ist die Code.
Mann kann es für seine Bedürfnisse einfach anpassen. Nur die Zeilen nach 'Adjust these values as needed' anpasssen.
Das Skript prüft ob:
SD Karte gesteckt und mit Quell-Ordner eingerichtet ist.
USB Media gesteckt ist.
Ziel-Ordner eingerichtet ist.
Es gibt Dateien in den Quell-Ordner.
Am ende wird ausgegeben wie viele Dateien kopiert wurde.
Keine Dateien werden gelöscht. Dafür habe ich eine andere Skript.

Code:
Sub Copy_log_to_USB_WinCE()

'script for copying all logfiles from SD card to USB media

On Error Resume Next

'>>Setup file system
'Code for Windows CE !

Dim objfs, str_media_SD, str_media_USB, str_log_path, str_filesearch, str_full_path_SD, str_full_path_USB
Dim dir_result, str_source_filename, str_target_filename, i, maxfiles
Set objfs = CreateObject("filectl.filesystem")

'Adjust these setup values as needed
str_media_SD = "\Storage Card SD\"
str_media_USB = "\Storage Card USB\"
str_log_path = "LOG\"
str_filesearch = "*.csv"
maxfiles = 999

str_full_path_SD = str_media_SD & str_log_path
str_full_path_USB = str_media_USB & str_log_path

If objfs.dir(str_media_SD)="" Then
  ShowSystemAlarm "SD card for log file is not installed: " & str_media_SD
  Exit Sub
End If

If objfs.dir(str_media_USB)="" Then
  ShowSystemAlarm "USB media for backup files is not inserted: " & str_media_USB
  Exit Sub
End If

'>>On Windows CE, check If folder exists
If objfs.dir(str_full_path_USB)="" Then
    'If folder is not found, create it
    objfs.mkdir(str_full_path_USB)
End If

'Use .dir to find the filenames in the source folder
dir_result = objfs.Dir(str_full_path_SD & str_filesearch) ' first call of .dir must be with search string
If dir_result = ""     Then
        ShowSystemAlarm "No log files found."
        Exit Sub
    Else
        str_source_filename = str_full_path_SD & dir_result
        str_target_filename = str_full_path_USB & dir_result
        objfs.FileCopy str_source_filename, str_target_filename 'Copy the file !
        For i = 1 To maxfiles
            dir_result = objfs.Dir() ' subsequent calls of .dir without search string returns the next file
            If dir_result ="" Then
                Exit For
            Else
                str_source_filename = str_full_path_SD & dir_result
                str_target_filename = str_full_path_USB & dir_result
                objfs.FileCopy str_source_filename, str_target_filename 'Copy the file !
            End If
        Next
End If
          
If Err.Number <> 0 Then
    ShowSystemAlarm "Backup script error. " & Err.Number & " " & Err.Description
    Err.Clear
    Exit Sub
End If

If i= 1 Then
    ShowSystemAlarm "1 file was copied to USB media."
Else
    ShowSystemAlarm CStr(i) & " files were copied to USB media."
End If

End Sub
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Kannst du das Lösch Skript noch zeigen?

OK
Code:
Sub Delete_log_from_SD_WinCE()

'script for deleting all logfiles from SD card

On Error Resume Next

'>>Setup file system
'Code for Windows CE !

Dim objfs, str_media, str_log_path, str_full_path
Set objfs = CreateObject("filectl.filesystem")
str_media = "\Storage Card SD\"
str_log_path = "LOG\*.*"

str_full_path = str_media & str_log_path

If objfs.dir(str_full_path)="" Then
  ShowSystemAlarm "SD card for log file is not installed: " & str_full_path
  Exit Sub
End If

objfs.Kill str_full_path

If Err.Number <> 0 Then
    ShowSystemAlarm "Delete logs script error. " & Err.Number & " " & Err.Description
    Err.Clear
    Exit Sub
End If

End Sub
 
Zurück
Oben