# Move *.* bzw. Dateien kopieren



## Dino (6 Januar 2011)

Hallo Jungs!

Hiermit möchte ich auch meinen bescheidenen Beitrag zum Forum bringen. Dies als Danke schön für all die Hilfe die ich schon bekommen habe und als Unterstützung für Die, die auch nicht sehr viel Zeit zum Entwickeln haben! 

Das folgende WinCC-Flex-Code ermöglicht ein Move von CSV-Dateien von einer MMC-Karte auf ein USB-Stick. Die CSV-Dateien sind Archivdateien (von einem MP277-Panel generiert), welche original als "Read only" deklariert sind. Es scheint mir deshalb ein wichtiger Punkt zu sein, weil  ein "Read only" erst als "Normal" umgetauft werden muss um Ihn nach dem Kopierauftrag zu löschen (move). 
Der Löschauftrag ist in diesem Code nur auf .csv bezogen (fso.Kill ("\Storage Card MMC\*.csv")). Nun ist es auch mit *.* möglich jedoch kommt eine Fehlermeldung wenn auf dem MMC irgend ein Ordner bestehend ist. Bei mir habe ich immer ein "Simatic-Ordner" nach einem  Download. Kommt mit Sicherheit vom Betriebssystem.
Die Namensgebung dieser Archiven finde ich sehr lang. Ich kopiere immer vom "Root-MMC" auf das "Root-USB". Ist der Pathname zu lange, ist das Panel nicht erfreut!
Offene Dateien haben es nicht gern wenn mann sie kitzelt!

Ich hoffe das Progamm funktioniert bei Euch gleich problemlos wie bei mir! 

Benutzte Variablen in "normalen" WinnCC-Flex 
---------------------------------------------------
DataSaveText        : Int-Variable steuert eine Textliste (siehe Kommentare)
DataSourceFileName    : Stringvariable (L90) um das Sourcefile am Panel einzublenden (wie Explorer: Kopieren Von x nach Y)
DataDestFileName    : Stringvariable (L90) um das Destinationfile am Panel einzublenden (wie Explorer: Kopieren Von x nach Y)
ScriptIndex        : Zeigt die Anzahl kopierter Dateien an (wie Explorer: 5 Datei(en) kopiert)



```
[COLOR=Black]

[/COLOR]  [COLOR=Black]'Skript "CopyFile" / DI - 04.01.2011
'===========================================

Dim PathSearch, Path, fso, Result, Index, SourceFile, DestFile[/COLOR] [COLOR=Black]

Set PathSearch = CreateObject("FileCtl.FileSystem")[/COLOR] [COLOR=Black]



[/COLOR]    [COLOR=Black]'USB-Stick suchen
'----------------

    Path = "Storage Card USB" [/COLOR] [COLOR=Black]

    SetValue SmartTags("DataSaveText"), 1                 'Text: Suche USB-Stick     [/COLOR][COLOR=Black]

    For Index = 1 To 30000                                 'entspricht ca. 20 Sekunden    [/COLOR] [COLOR=Black]
        If  PathSearch.Dir("\" & Path) = ""_
        And Index >= 30000 Then
        SetValue SmartTags("DataSaveText"), 2             'Text: USB-Stick nicht gefunden!

        ElseIf PathSearch.Dir("\" & Path) = Path Then     'Gefunden!         [/COLOR][COLOR=Black]
        SetValue SmartTags("DataSaveText"), 3            'Text: Datenübertragung gestartet
        Exit For
        End If
    Next

'CSV-Daten suchen, Kopieren und Attribut auf Normal setzen     [/COLOR][COLOR=Black]
'---------------------------------------------------------    

    If SmartTags("DataSaveText")= 3 Then                'Datenübertragung gestartet[/COLOR] [COLOR=Black]
        Set fso = CreateObject("FileCtl.FileSystem")

        Result = fso.Dir("\Storage Card MMC\*.csv")         [/COLOR][COLOR=Black]
        If Result = "" Then
                            SmartTags("DataSaveText")= 4'Text:Keine Daten vorhanden
                        Else
                            SourceFile = "\Storage Card MMC\" & Result
                            DestFile   = "\Storage Card USB\" & Result
                            SmartTags("DataSourceFileName")= SourceFile
                            SmartTags("DataDestFileName")= DestFile
                            fso.FileCopy SourceFile,DestFile
                            fso.SetAttr  SourceFile, 0                        
                            For Index = 1 To 999
                                Result = fso.Dir()    
                                If Result = "" Then
                                    Exit For
                                Else
                                    SourceFile = "\Storage Card MMC\" & Result
                                    DestFile   = "\Storage Card USB\" & Result
                                    SmartTags("DataSourceFileName")= SourceFile
                                    SmartTags("DataDestFileName")= DestFile
                                    fso.FileCopy SourceFile,DestFile
                                    fso.SetAttr  SourceFile, 0
                                End If    
                            Next
                        SmartTags("DataSaveText")= 5    'Textdaten mit Erfolg übertragen
                        SetValue SmartTags("ScriptIndex"), Index                            

        End If                                 [/COLOR][COLOR=Black]
    End If

'Daten auf MMC löschen     [/COLOR][COLOR=Black]
'---------------------
fso.Kill ("\Storage Card MMC\*.csv")

'Init[/COLOR] [COLOR=Black]
'----
Set PathSearch = Nothing
Set fso = Nothing

[/COLOR]
```


----------



## volker (7 Januar 2011)

ohne es getestet zu haben hielt ich es für wert dies in die faq zu kopieren.


----------



## Dino (7 Januar 2011)

Hallo Harald

Ich bin mit dem Händling von diesem Forum noch nicht so vertraut. Danke für den Typ 
	
	



```
. Ich hatte die Funktion zwar gesucht und nicht gefunden.

Gruss, Dino
```


----------



## PN/DP (7 Januar 2011)

volker schrieb:


> ohne es getestet zu haben hielt ich es für wert dies in die faq zu kopieren.


Das ist tatsächlich ein schönes VBS-Beispiel mit Dateifunktionen unter WinCE zum darauf verweisen. 
	

	
	
		
		

		
			





Harald


----------



## Dino (11 Januar 2011)

Hallo Jungs!

Anbei noch eine Variante mit Namengebung des Destinationsfiles. Das oder die Dateien werden beim Kopiervorgang umbenannt in:
"MeinString" & "Datum Zeit der Quelldatei".
Achtung: diese Prozedur bedingt eine Änderung in den regionalen Settings (control panel). Leider habe ich keine bessere Lösung gefunden! Zwingend muss in "Time" das ":" gegen ein "." ausgewechselt werden. Nicht zwingend kann in "Date" das Format "JJJJ.MM.TT" gesetzt werden. Das letztere hat den Vorteil auf dem USB-Stick Ordnung zu schaffen. Es hat jedoch den Nachteil die Alarmliste auch in diesem ungewöhnlichen Format anzuzeigen.

Im "normalen WinnCC-Flex" bitte folgende Variable deklarieren:
DataMmcFilename: String (L32, kann auch anders sein)



```
'Skript "CopyRenameFile" / DI - 11.01.2011
'===========================================

Dim PathSearch, Path, fso, Result, Index, SourceFile, DestFile

Set PathSearch = CreateObject("FileCtl.FileSystem")

'USB-Stick suchen
'----------------

    Path = "Storage Card USB" 
    
    SetValue SmartTags("DataSaveText"), 1                 'Text: Suche USB-Stick

    For Index = 1 To 30000                                 'entspricht ca. 20 Sekunden    
        If  PathSearch.Dir("\" & Path) = ""_
        And Index >= 30000 Then
        SetValue SmartTags("DataSaveText"), 2             'Text: USB-Stick nicht gefunden!
        
        ElseIf PathSearch.Dir("\" & Path) = Path Then     'Gefunden!
        SetValue SmartTags("DataSaveText"), 3            'Text: Datenübertragung gestartet
        Exit For
        End If
    Next
    
'CSV-Daten suchen, mit neuem Namen kopieren und Attribut auf Normal setzen     
'-------------------------------------------------------------------------        

    If SmartTags("DataSaveText")= 3 Then                'Datenübertragung gestartet
        Set fso = CreateObject("FileCtl.FileSystem")
            
        If  SmartTags("DataMmcFilename") = "" Then        'Leerer String als Dateiname
            SmartTags("DataMmcFilename")= "Archiv"        'ist unschön
        End If            
                
        Result = fso.Dir("\Storage Card MMC\*.csv")        'Suchen nach ersten Dateiname
        If Result = "" Then
                            SmartTags("DataSaveText")= 4'Text:Keine Daten vorhanden
                        Else
                            SourceFile = "\Storage Card MMC\" & Result
                            DestFile   = "\Storage Card USB\" & SmartTags("DataMmcFilename")& "_" & fso.fileDateTime(SourceFile) & ".csv"
                            SmartTags("DataSourceFileName")= SourceFile
                            SmartTags("DataDestFileName")= DestFile
                            fso.FileCopy SourceFile,DestFile
                            fso.SetAttr  SourceFile, 0                        
                            For Index = 1 To 999
                                Result = fso.Dir()        'Suchen nach weitere Dateinamen
                                If Result = "" Then
                                    Exit For
                                Else
                                    SourceFile = "\Storage Card MMC\" & Result
                                    DestFile   = "\Storage Card USB\" & SmartTags("DataMmcFilename")& "_" & fso.fileDateTime(SourceFile) & ".csv"
                                    SmartTags("DataSourceFileName")= SourceFile
                                    SmartTags("DataDestFileName")= DestFile
                                    fso.FileCopy SourceFile,DestFile
                                    fso.SetAttr  SourceFile, 0
                                End If    
                            Next
                        SmartTags("DataSaveText")= 5    'Text:Daten mit Erfolg übertragen
                        SetValue SmartTags("ScriptIndex"), Index                            
                                
        End If
    End If
    
'Daten auf MMC löschen
'---------------------
fso.Kill ("\Storage Card MMC\*.csv")

'Init
'----
Set PathSearch = Nothing
Set fso = Nothing
```
Ich wäre sehr froh wenn mich jemanden belehren könnte wie man einen WinCE-String mit WinCC-Flex ausseinander-schlachten und wieder zusammensetzen kann, zum Beispiel:
2011.01.11 18:06:33 ändern in
2011.01.11_18.06.33

Schöner Gruss, Dino


----------



## rostiger Nagel (11 Januar 2011)

Du kannst String's mit den Befehlen 'LEFT'; 'MID' und 'RIGHT' zerlegen in
Variabeln schieben und dann mit '&' wieder Zusammensetzen. 
Möchtest zb deinen Unterstrich hinzufügen, könnte da etwa so aussehen


```
VarNeuesDatum = VarDatum & "_" & VarUhrzeit
```

Übrigens eine zeitfunktion in flexibel bekommst du so hin,
da deine Schleife bestimmt Plattform abhängig ist.


```
'Timer 100 endspricht 1sec.
Dim StartTime, StopTime, i
StartTime = Now
StopTime = StartTime + DelayTime / 24 / 360000
Do
Loop Until Now >= StopTime
```


----------



## Dino (11 Januar 2011)

Hallo Helmut,

Danke schön für die rasche Antwort. Kannst du mir bitte:
- versichern, dass die Funktionen LEFT, RIGHT. MIDDLE auch mit Windows CE (auf einem MP277) funktionieren?
- würdest du mir bitte ein kleines Beispiel des Zelegens vorzeigen? Das zusammensetzen ist mir klar. Ein Links auf eine FAQ oder so würde auch genügen. 

Übrigens thanks a lot for your example "Timer"

Schöner Gruss, Dino


----------



## rostiger Nagel (11 Januar 2011)

Dino schrieb:


> Hallo Helmut,
> 
> Danke schön für die rasche Antwort. Kannst du mir bitte:
> - versichern, dass die Funktionen LEFT, RIGHT. MIDDLE auch mit Windows CE (auf einem MP277) funktionieren?
> ...



Neh versichern kann ich dir das nur wenn die Versicherungsprämie hoch
genug ist. Ich hab das bisher nur auf PC Runtimes gemacht, aber denke das 
sollte gehen, da die Befehle ja nicht auf das file System zugreifen sonder auf
einen String. Ich werde das morgen gerne mal testen und berichten. 

Gruss Helmut


----------



## PN/DP (12 Januar 2011)

Dino schrieb:


> Kannst du mir bitte:
> - versichern, dass die Funktionen LEFT, RIGHT. MIDDLE auch mit Windows CE (auf einem MP277) funktionieren?
> - würdest du mir bitte ein kleines Beispiel des Zelegens vorzeigen? Das zusammensetzen ist mir klar. Ein Links auf eine FAQ oder so würde auch genügen.


Die Left-, Right-, Mid-Funktionen funktionieren auf WinCE-Panels.

In der WinCCflex-Hilfe gibt es eine VBS-Sprachreferenz mit Tutorium und Beispielen, da findet man die Left-, Right-, Mid- und andere Funktionen mit Beispielen beschrieben. Außer den speziellen WinCE-File-Funktionen funktionieren wahrscheinlich alle VBS-Funktionen auf WinCE-Panels, jedenfalls haben bei mir alle von mir bisher benutzten VBS-Funktionen auch auf WinCE-Panels funktioniert.
Einfach im Script-Editor ein VBS-Schlüsselwort eintippen und F1 drücken
und siehe *WinCC flexible Information System > Arbeiten mit WinCC flexible > Referenz*

Jaja, Datum/Uhrzeit und regionale Settings sind schon ein nerviges Paar ... 
Deshalb erzeuge ich Zeit-Strings immer unabhängig von den regionalen Settings mit der DatePart-Funktion:

```
' aus der Systemzeit einen String in der Form "31.12.2099 01:59:59" erzeugen
Dim t, s
t = Now ' Systemzeit
s = Right("0" & DatePart("d", t), 2) & "." & Right("0" & DatePart("m", t), 2) & "." & DatePart("yyyy", t) & " " _
  & Right("0" & DatePart("h", t), 2) & ":" & Right("0" & DatePart("n", t), 2) & ":" & Right("0" & DatePart("s", t), 2)
```

Datum_Uhrzeit-String für Dateinamen erzeugen:

```
' aus der Systemzeit einen String in der Form "20991231_015959" erzeugen
Dim t, s
t = Now ' Systemzeit
s = DatePart("yyyy", t) & Right("0" & DatePart("m", t), 2) & Right("0" & DatePart("d", t), 2) & "_" _
  & Right("0" & DatePart("h", t), 2) & Right("0" & DatePart("n", t), 2) & Right("0" & DatePart("s", t), 2)
```
Dino, falls Du tatsächlich "2011.01.11_18.06.33" mit Punkten haben willst, dann bau Dir die Punkte in das letzte Beispiel ein.

Harald


----------



## PN/DP (12 Januar 2011)

Übrigens ... eine Zeitfunktion realisiere ich ähnlich wie Helmut.
Der folgende Code startet ein BAT-Programm (welches eine Befehlsausgabe in eine Textdatei schreibt) und wartet dann maximal 10 Sekunden auf das Erscheinen der Ausgabedatei:

```
' 10 Sekunden = #00:00:10# = TimeSerial(0, 0, 10)
Dim breaktime

breaktime = Now + #00:00:10# 'max bis "Jetzt + 10 Sekunden" warten
StartProgram "CMD.EXE", "/c \TEMP\gethostname.bat", hmiShowMinimized, hmiYes

Do While Not FileExist("\TEMP\ipconfig.txt")
    If (Now > breaktime) Then Exit Do 'Zwangsausgang bei Überschreitung Wartezeit
Loop 'auf Programmende warten
```
(FileExist siehe VB-Script-FAQ und den Hinweis am Ende des Beitrags davor)

Harald


----------



## Dino (12 Januar 2011)

Liebe Brain-Sponsoren!

Wahnsinig was dank Euch so ein Forumthema bringen kann!
Dank Harald und Helmut komme ich nun zu meiner nächsten "Evolution" des "CopyRenameSkriptes".
In dieser Version (hoffentlich die letzte) braucht es keine Umstellung mehr in den regionalen Settings!


```
'Skript "CopyRenameFile" / DI - 12.01.2011
'===========================================

Dim PathSearch, Path, fso, Result, Index, SourceFile, DestFile, DateOfSourcefile, DateAsString

Set PathSearch = CreateObject("FileCtl.FileSystem")

'USB-Stick suchen
'----------------

    Path = "Storage Card USB" 
    
    SetValue SmartTags("DataSaveText"), 1                 'Text: Suche USB-Stick

    For Index = 1 To 30000                                 'entspricht ca. 20 Sekunden    
        If  PathSearch.Dir("\" & Path) = ""_
        And Index >= 30000 Then
        SetValue SmartTags("DataSaveText"), 2             'Text: USB-Stick nicht gefunden!
        
        ElseIf PathSearch.Dir("\" & Path) = Path Then     'Gefunden!
        SetValue SmartTags("DataSaveText"), 3            'Text: Datenübertragung gestartet
        Exit For
        End If
    Next
    
'CSV-Daten suchen, mit neuem Namen kopieren und Attribut auf Normal setzen     
'-------------------------------------------------------------------------        

    If SmartTags("DataSaveText")= 3 Then                'Datenübertragung gestartet
        Set fso = CreateObject("FileCtl.FileSystem")
            
        If  SmartTags("DataMmcFilename") = "" Then        'Leerer String als Dateiname
            SmartTags("DataMmcFilename")= "Archiv"        'ist unschön
        End If            
                
        Result = fso.Dir("\Storage Card MMC\*.csv")        'Suchen nach ersten Dateiname
        If Result = "" Then
                            SmartTags("DataSaveText")= 4'Text:Keine Daten vorhanden
                        Else
                            SourceFile = "\Storage Card MMC\" & Result
                            DateOfSourcefile = fso.fileDateTime(SourceFile)
                            DateAsString =   DatePart("yyyy", DateOfSourcefile)              & "." _
                                           & Right("0" & DatePart("m", DateOfSourcefile), 2) & "." _
                                              & Right("0" & DatePart("d", DateOfSourcefile), 2) & "_" _
                                              & Right("0" & DatePart("h", DateOfSourcefile), 2) & "h" _ 
                                              & Right("0" & DatePart("n", DateOfSourcefile), 2) & "m" _
                                              & Right("0" & DatePart("s", DateOfSourcefile), 2) & "s"
                            DestFile   = "\Storage Card USB\" & SmartTags("DataMmcFilename")& "_" & DateAsString & ".csv"
                            SmartTags("DataSourceFileName")= SourceFile
                            SmartTags("DataDestFileName")= DestFile
                            fso.FileCopy SourceFile,DestFile
                            fso.SetAttr  SourceFile, 0                        
                            For Index = 1 To 999
                                Result = fso.Dir()        'Suchen nach weitere Dateinamen
                                If Result = "" Then
                                    Exit For
                                Else
                                    SourceFile = "\Storage Card MMC\" & Result
                                    DateOfSourcefile = fso.fileDateTime(SourceFile)
                                    DateAsString =   DatePart("yyyy", DateOfSourcefile)              & "." _
                                                      & Right("0" & DatePart("m", DateOfSourcefile), 2) & "." _
                                                         & Right("0" & DatePart("d", DateOfSourcefile), 2) & "_" _
                                                           & Right("0" & DatePart("h", DateOfSourcefile), 2) & "h" _ 
                                                         & Right("0" & DatePart("n", DateOfSourcefile), 2) & "m" _
                                                         & Right("0" & DatePart("s", DateOfSourcefile), 2) & "s"                        
                                    DestFile   = "\Storage Card USB\" & SmartTags("DataMmcFilename")& "_" & DateAsString & ".csv"
                                    SmartTags("DataSourceFileName")= SourceFile
                                    SmartTags("DataDestFileName")= DestFile
                                    fso.FileCopy SourceFile,DestFile
                                    fso.SetAttr  SourceFile, 0
                                End If    
                            Next
                        SmartTags("DataSaveText")= 5    'Text:Daten mit Erfolg übertragen
                        SetValue SmartTags("ScriptIndex"), Index                            
                                
        End If
    End If
    
'Daten auf MMC löschen
'---------------------
fso.Kill ("\Storage Card MMC\*.csv")

'Init
'----
Set PathSearch = Nothing
Set fso = Nothing
```

Auf bald, Dino


----------



## PaKir (12 Mai 2014)

Hallo, auch wenn das Thema schon ein wenig älter ist hab ich mich gerade mal daran versucht.

Wie Verhält es sich wenn der Ordner sich auf einem mit dem Panel verbundenen PC befindet?
Habe einen Ordner auf dem PC freigegeben auf den ich auch im Explorer des Panels zugreifen kann. 
Es ist außerdem auch möglich z.B. ein Variablenarchiv darauf zu speichern also die Verbindung dahin steht.
In beiden Fällen werde ich einmalig nach Benutzername/Passwort/Domäne gefragt.

Will ich nun das Scipt bzw. erstmal nur den Bereich "USB-Stick suchen" nutzen und gebe den
 Freigabename z.B. "*\\PC-NAME\Ordnername*" als Pfadname anstatt "*Storage Card USB*" an kann von dort nicht gelesen werden. 
Bei den Schreibweisen "*\\PC-NAME\Ordnername*" und "*\\PC-NAME\Ordnername\*" wird das Verzeichnis nicht gefunden.
Bei der Schreibweise "*\PC-NAME\Ordnername*" bleibt das Script im Schritt "Suchen" hängen und es passiert nichts weiteres.

Irgendwer  ne Ahnung wie ich da vorgehen muss? Müssen die Anmeldedaten irgendwie  mit ins Script oder muss man das komplett anders angehen?
Testpanel ist zur Zeit ein MP377 19" Touch (6AV6 644-0AC01-2AX1)
Danke schonmal im Vorraus.

fg
Pascal


----------



## PN/DP (12 Mai 2014)

Schreibweise im Skript:

```
' Prüfen Erreichbarkeit und Zugriff auf freigegebenen Ordner eines PC im Netzwerk
Dim fso, bOK_PC_Freigabe, FreigabeName 

bOK_PC_Freigabe = False
FreigabeName = "\\PC-NAME\Ordnername"

' Prüfen unter Windows CE (z.B. MP377)
Set fso = CreateObject("FileCtl.FileSystem")
If fso.Dir(FreigabeName) <> "" Then bOK_PC_Freigabe = True 'kann einige Sekunden dauern!


' Prüfen unter Win32 (z.B. RT-Simulation)
Set fso = CreateObject("Scripting.FileSystemObject")
If fso.FolderExists(FreigabeName) Then bOK_PC_Freigabe = True 'kann einige Sekunden dauern!
```

Die Anmeldedaten am besten im Control Panel hinterlegen:
Control Panel > Network ID

Wenn keine Anmeldedaten hinterlegt sind oder der Zugriff fehlschlägt, dann poppt im Skriptablauf der Anmeldedialog auf, um andere Anmeldedaten einzugeben.

Manuelles Prüfen im Command prompt ob der Zugriff auf den PC funktioniert:

```
CMD \>net view \\PC-NAME
CMD \>dir \\PC-NAME\Ordnername
```

Schau Dir mal diese Checkliste an: FAQ: Von Panel auf PC über LAN zugreifen

Harald


----------

