TIA VBS-Skript Verzeichnis mit Jahreszahl erstellen

schwimmer

Level-3
Beiträge
1.727
Reaktionspunkte
627
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,
meine Erfahrungen mit Skripten stecken noch in den Kinderschuhen und ich habe versucht mit den hier im Forum geposteten Skripten mein Problem zu lösen, komme jedoch leider nicht zum Ziel.
Habe ein TP1200 und nutze TIA V17
Ich möchte ein Verzeichniss erstellen, dass das aktuelle Jahr enthält. Wenn ich ein festes Verzeichnis vorgebe, dann klappt es auch, ich schaffe es aber nicht darin ein Verzeichnis mit dem aktuellen Jahr zu erstellen. Wenn ich das ganze Skript hier reinkopiere sieht ds ziemlich wüst aus, wie bekommen die Experten das so schön hin?
Es klappt mit:
Ziel = "Storage Card SD\Sintern\Archiv\"
fs.mkdir = Ziel

Dann habe ich eine Variable JJJJ = Year(Now) deklariert. Wie kann ich die an mein Ziel anknüpfen damit das Unterverzeichnis mit dem aktuellen jahr erstellt wird?
 
Ich hole den Jahr in diese Weise:
Code:
CStr(DatePart("yyyy",Date))

Den Pfad kannst du dann zusammenbauen:
Code:
str_Pfad = "Storage Card SD\Sintern\Archiv\" & CStr(DatePart("yyyy",Date)) & "\"

Edit: Year(Now) ist vielleicht ebensogut wie DatePart("yyyy", Date)
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Code:
JJJJ = Year(Now)
Ziel = "Storage Card SD\Sintern\Archiv\" & JJJJ & "\"  'ergibt: "Storage Card SD\Sintern\Archiv\2022\"

Eventuell generell interessant für Dich:
... erzeuge ich Zeit-Strings immer unabhängig von den regionalen Settings mit der DatePart-Funktion:
Code:
' 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:
Code:
' 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)

Harald
 
Code:
JJJJ = Year(Now)
Ziel = "Storage Card SD\Sintern\Archiv\" & JJJJ & "\"  'ergibt: "Storage Card SD\Sintern\Archiv\2022\"

Eventuell generell interessant für Dich:


Harald
Hallo Harald,
wenn ich es so schreibe wie du, dann bekomme ich an der Stelle wo das Verzeichnis erstellt werden soll den Fehler
20010: The System cannot find the path specified. Dann folgt der Name des Skriptes und die ZeilenNr. in der ich mit fs.mkdir = (Ziel) das Verzeichnis erstellen möchte

Edit:
Habe jetzt nochmal probiert, mit einem Unterverzeichnis, also
"Storage Card SD\Sintern\" & JJJJ & "\"
klappt es. Mit dem kompletten Pfad
"Storage Card SD\Sintern\Archiv\" & JJJJ & "\"
bekomme ich die Fehlermeldung
 
Zuletzt bearbeitet:
Okay, das habe ich hinbekommen und dann klappt es auch mit meinen Skripten.
Was ich nicht schaffe, ist es die Daten von der SD-Card auf einen USB-Stick zu sichern. Wenn ich die vielen Einträge hier im Forum richtig verstehe, gibt es die Funktion ein Verzeichis mit Unterverzeichnissen samt Dateien 1:1 zu kopieren nicht. (Bei Verwendung des TP1200 Comfort)
Wie kann ich so eine Struktur kopieren, wenn mir die Unterverzeichnisse und Dateinamen nicht bekannt sind?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo schwimmer,

kurz gesagt:
+ Schleife, in der der Befehl "fs.dir" verwendet wird, um das nächste Objekt (Datei) innerhalb eines Verzeichnisses zu ermitteln und mit den erhaltenen Infos den Kopiervorgang durchführen
+ Ggf. das Script mit o.g. Vorgang rekursiv aufrufen, um verschachtelte Verzeichnisstrukturen zu bearbeiten.

Ich gehe davon aus, dass du zu diesem Thema einiges im Forum finden wirst.


Gruß, Fred
 
... um das nächste Objekt (Datei) innerhalb eines Verzeichnisses zu ermitteln und mit den erhaltenen Infos den Kopiervorgang durchführen
Das nächste Objekt kann aber auch ein Ordner/Verzeichnis sein.

Ich denke, wenn es den einen Ordner gibt, der alle benötigten Unterverzeichnisse und Dateien enthält, jedoch keine nicht benötigten UnterVerzeichnisse und keine nicht benötigten Dateien, dann kann man mit einem einzigen KopierBefehl ab hier alles kopieren.
Allerdings müsste der ZielPfad bis hin zu diesem Ordner ggfs zunächst einmal "mühsam" (Schritt für Schritt) aufgebaut werden.
Von VBS habe ich allerdings keine Ahnung, nur ein wenig von VBA. Leider geht in VBS vieles anscheinend nicht, was für VBA selbsverständlich zu sein scheint. Und VBS scheint auch nicht gleich VBS zu sein. Anscheinend gibt es je nach "Umfeld" unterschiedliche Einschränkungen.

PS:
In den Hilfen wird manchmal zwischen den Begriffen Ordner und Verzeichnis unterschieden, aber ich habe noch nicht herausgefunden, ob es wirklich irgendeinen Unterschied gibt. Ich habe nach wie vor den Eindruck, dass beide Begriffe absolut gleichbedeutend sind.
 
Zuletzt bearbeitet:
Hallo schwimmer,

kurz gesagt:
+ Schleife, in der der Befehl "fs.dir" verwendet wird, um das nächste Objekt (Datei) innerhalb eines Verzeichnisses zu ermitteln und mit den erhaltenen Infos den Kopiervorgang durchführen
+ Ggf. das Script mit o.g. Vorgang rekursiv aufrufen, um verschachtelte Verzeichnisstrukturen zu bearbeiten.

Ich gehe davon aus, dass du zu diesem Thema einiges im Forum finden wirst.


Gruß, Fred
Hallo Fred,
ich habe ein Skript-Beispiel gefunden, allerdings bekomme ich es mit dem "fs.dir()" nur ans Laufen wenn alle Datein im Root-Verzeichnis liegen. Alles andere wir anscheinend ignoriert.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
In den Hilfen wird manchmal zwischen den Begriffen Ordner und Verzeichnis unterschieden, aber ich habe noch nicht herausgefunden, ob es wirklich irgendeinen Unterschied gibt. Ich habe nach wie vor den Eindruck, dass beide Begriffe absolut gleichbedeutend sind.
Ja, "Verzeichnis" und "Ordner" sind gleichbedeutend. Auch in der englischsprachigen VBS-Dokumentation werden die Begriffe "directory" und "folder" synonym verwendet.
Ich meine, gaaanz früher (in den 80ern?) wurde der Begriff "Verzeichnis" verwendet, und irgendwann hat Windows den Begriff "Ordner" dafür eingeführt. Heute existieren beide Begriffe, und ich verwende die auch gemischt, wie es gerade besser klingt.


Wie kann ich so eine Struktur kopieren, wenn mir die Unterverzeichnisse und Dateinamen nicht bekannt sind?
Wieso ist die Verzeichnisstruktur auf der SD-Karte nicht bekannt? Nur wegen den Jahreszahl-Ordnern? Musst Du wirklich alles kopieren, was sich (warum auch immer) auf der SD-Karte befindet? Kannst Du das nicht irgendwie auf nur bestimmte gewollte bekannte Ordner eingrenzen (und nacheinander abarbeiten)?

Wenn wirklich eine unbekannte Ordnerstruktur inkl. den Unterordnern mit VBS-Funktionen kopiert werden soll, dann muß man (so wie faust bereits in #9 angedeutet hat) mit der Dir-Methode die Ordnerstruktur erforschen, die aufgefundenen Einträge unterscheiden, ob es Ordner oder Dateien sind, und sich (rekursiv oder iterativ) durch die aufgefundenen Ordner durcharbeiten. Dafür könnte man dieses Programmbeispiel entsprechend ausbauen:
FAQ: WinCC Flex VBScript WinCe - Move *.* bzw. Dateien kopieren

Folgende VBS-Methoden der File System Controls sind relevant:
Dir (siehe da auch das Attribut fsAttrDirectory), GetAttr, FileCopy, MoveFile, MkDir
Die Beschreibung VBScript_WinCE.pdf kann man hier in der VBS-Dateien-FAQ #1 und in der Siemens Support FAQ finden.
Weitere hilfreiche VBS-Funktionen wie FolderExist und FileExist für WinCE sind in der VBS-Dateien-FAQ #2 und #3 zu finden.

Ein Programm zum Kopieren aller Dateien inklusive Ordnerstruktur in VBS für WinCE wird seeehr aufwendig.

Einfacher wird es, wenn man die in der WinCE-"Eingabeaufforderung" vorhandenen Datei-Kopier-Befehle verwendet, z.B. den (DOS-)Befehl xcopy
(Ich weiß allerdings nicht, wieweit Siemens das WinCE auf den Comfort Panels kastriert hat, ich habe auch kein Comfort Panel zum ausprobieren zur Verfügung.)
Einen Befehl in der Eingabeaufforderung ausführen kann man so:
StartProgram "CMD.EXE", cmdline, hmiShowMinimized, hmiYes

Noch eine unschöne Macke: WinCE-Programme kennen anscheinend (bei Siemens?) kein "Minimized" -> der CMD-Aufruf ist immer kurzzeitig in Vollbild zu sehen. (das war bei MP27x/MP37x so, und ist vermutlich auch bei den Comfort Panels so?)

Harald
 
Wieso ist die Verzeichnisstruktur auf der SD-Karte nicht bekannt? Nur wegen den Jahreszahl-Ordnern? Musst Du wirklich alles kopieren, was sich (warum auch immer) auf der SD-Karte befindet? Kannst Du das nicht irgendwie auf nur bestimmte gewollte bekannte Ordner eingrenzen (und nacheinander abarbeiten)?
Hallo Harald,
wenn ich einen alle *.csv aus einem bekannten Ordner kopieren könnte wäre ich schon einen großen Schritt weiter. Mit dem Skript hier aus dem Forum schaffe ich es nur *.csv aus dem Root "Storage Card SD" zu kopieren. Wenn ich das Skrpt anpasse und weitere Verzeichnisse angebe klappt es nicht.
 
Wenn wirklich eine unbekannte Ordnerstruktur inkl. den Unterordnern mit VBS-Funktionen kopiert werden soll, dann muß man (so wie faust bereits in #9 angedeutet hat) mit der Dir-Methode die Ordnerstruktur erforschen, die aufgefundenen Einträge unterscheiden, ob es Ordner oder Dateien sind, und sich (rekursiv oder iterativ) durch die aufgefundenen Ordner durcharbeiten.
Laut VBA-Hilfe ist die DIR-Methode ausdrücklich NICHT rekursiv zu verwenden!

Mir erscheint es auch ein wenig kurios, wenn so gar nichts über den Pfad bekannt ist. Wie soll man den interessierenden Bereich identifizieren?
Ist denn sichergestellt, dass z.B. besimmte DateiNamen (nach denen man suchen könnte) nicht an mehreren Stellen des "Baums" vorkommen können?
Oder ergibt sich die Forderung daraus, dass eine eierlegendeWollmilchSau-Lösung geschaffen werden soll?
Ein Programm zum Kopieren aller Dateien inklusive Ordnerstruktur in VBS für WinCE wird seeehr aufwendig.
Kannst Du sicher sagen, dass das Kopieren einer Struktur (Ordner inkl. der untergeordneten Odner und aller enthaltenen Dateien), in VBS für WinCE nicht mit einem einzigen COPY möglich ist, Harald?
Ich habe die Hoffnung, dass es geht, sofern der ZielPfad bis hin zum relevanten Ordner vorhanden ist bzw. entsprechend angelegt wird.
Das Aufbauen des ZielPfades ist dann zwar immer noch zu-Fuss-Arbeit, aber recht übersichtlich machbar.
Einfacher wird es, wenn man die in der WinCE-"Eingabeaufforderung" vorhandenen Datei-Kopier-Befehle verwendet, z.B. ...
Wenn's denn nur so möglich sein sollte, warum nicht? Den ZielPfad vorbereiten kann man ja ggfs weiterhin im VBS. Das dürfte in VBS gut beherrschbar sein.

Wenn ich das Skrpt anpasse und weitere Verzeichnisse angebe klappt es nicht.
Habe zwar gerade nicht die Zeit, mich da reinzuknieen, aber könntest Du es mal hochladen? Das Script scheint wohl irgendwie nicht zur Aufgabenstellung zu passen?
Bitte möglichst auch ein Beispiel für den QuellPfad und den ZielPfad!
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Heinilein,

den Befehl "CopyFolder" gibt es nur unter Windows (besser: als Methode von "Scripting.FileSystemObject").
WinCE kennt nur das "FileCtl.FileSystem"-Objekt, für dieses ist nur "FileCopy" verfügbar.

Steht in der VBA-Hilfe auch, warum "Dir" nicht rekursiv aufgerufen werden soll?

Ich habe ein Script geschrieben, das ein Verzeichnis kopieren kann, solange keine Unterverzeichnisse in ihm existieren, da "Dir" dann eine Exception wirft. Man könnte jetzt diese Exception auswerten und das gleiche Script erneut und diesmal mit dem gefundenen Ordnernamen aufrufen usw.
 
Laut VBA-Hilfe ist die DIR-Methode ausdrücklich NICHT rekursiv zu verwenden!
Das wird sicher auch für VBS zutreffen. Man muß die DIR-Methode nicht rekursiv verschachtelt verwenden, man könnte auch zunächst die komplette Liste der Datei-Einträge abholen und danach die Liste abarbeiten. Oder jede Ordner-Ebene arbeitet mit einer eigenen Instanz eines FileSystem controls. Mit "rekursiv" meint ich auch mehr die Art, wie man sich durch die Listen der Ordner absteigend durcharbeitet. Das muß man nicht so streng auslegen, wie Du und ich "rekursiv" kennen.


Kannst Du sicher sagen, dass das Kopieren einer Struktur (Ordner inkl. der untergeordneten Odner und aller enthaltenen Dateien), in VBS für WinCE nicht mit einem einzigen COPY möglich ist, Harald?
Kann ich nicht. Ich kenne einfach keine Dokumentation, wo eine solche Copy-Methode für WinCE erwähnt wird. Wer sowas braucht, kann ja mal das Internet durchsuchen...

Harald
 
Ich habe ein Script geschrieben, das ein Verzeichnis kopieren kann, solange keine Unterverzeichnisse in ihm existieren, da "Dir" dann eine Exception wirft. Man könnte jetzt diese Exception auswerten und das gleiche Script erneut und diesmal mit dem gefundenen Ordnernamen aufrufen usw.
Man braucht keine Exceptions auswerten, man kann die von Dir gelieferten Einträge mit GetAttr untersuchen, ob das ein Ordnername oder Dateiname ist. Oder auch gleich der Dir-Methode mitteilen, daß sie z.B. nur Ordnernamen liefern soll.

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Steht in der VBA-Hilfe auch, warum "Dir" nicht rekursiv aufgerufen werden soll?
Hier ein Auszug aus der Dir-Hilfe (allerdings Dir-Funktion, nicht Dir-Methode, wie ich geschrieben hatte):
Die Dir-Funktion gibt den ersten Dateinamen zurück, der mit dem Argument Pfadname übereinstimmt. Weitere mit dem Argument Pfadname übereinstimmende Dateinamen erhalten Sie durch das erneute Aufrufen der Dir-Funktion ohne Angabe von Argumenten. Wenn keine weiteren übereinstimmenden Dateinamen gefunden werden, gibt die Dir-Funktion eine Null-Zeichenfolge ("") zurück. Wurde einmal eine Null-Zeichenfolge zurückgegeben, müssen Sie bei nachfolgenden Aufrufen wieder das Argument Pfadname angeben, da sonst ein Fehler auftritt. Sie können einen anderen Wert für Pfadname angeben, bevor sie alle mit dem aktuellen Wert von Pfadname übereinstimmenden Dateinamen abgerufen haben. Ein rekursiver Aufruf der Dir-Funktion ist allerdings nicht möglich. Beim Aufruf von Dir mit dem Attribut vbDirectory werden Unterverzeichnisse nicht fortlaufend zurückgegeben.
Begründung habe ich nicht gefunden, aber eine Funktion ist ja auch nicht automatisch so programmiert, dass sie rekursiv benutzt werden kann.
Eine Ordner-Datei-Struktur kann sehr umfangreich werden und somit auch die Menge der Daten, die eine Dir-Funktion anlegen/mitschleppen muss.
Muss diese je "Schicht" der Rekursion wiederholt angelegt werden, dann explodiert der SpeicherBedarf. Ich vermute mal, dass hier der Grund dafür liegen könnte, dass kein rekursiver Aufruf "eingeplant" ist.

Edit: DIR entspricht nicht einer "FC-Funktion", denn sie hat irgendwo ein Gedächtnis und macht mit dem nächsten Ordner bzw. der nächsten Datei weiter, wenn man DIR() schreibt.

Das muß man nicht so streng auslegen, wie Du und ich "rekursiv" kennen.
Sind wir beide denn zu vorsichtig, zu skeptisch veranlagt, Harald? :unsure:
Kann ich nicht. Ich kenne einfach keine Dokumentation, wo eine solche Copy-Methode für WinCE erwähnt wird. Wer sowas braucht, kann ja mal das Internet durchsuchen...
Diesmal habe ich vielleicht das Wort COPY zu allgemein benutzt. Mein Hinterkopf sagt mir, dass kopieren auch unter anderen "Begriffen" möglich ist, die es vielleicht eher nicht vermuten lassen. War das NAME oder ??? ... bin doch etwas aus der Übung, was VBA und Konsorten betrifft. ;)
 
Zuletzt bearbeitet:
Wenn ich das Skrpt anpasse und weitere Verzeichnisse angebe klappt es nicht.
Da musst Du halt gezielt untersuchen und rauskriegen warum es nicht "klappt". Nur rumheulen "klappt nicht" bringt Dich der Lösung keinen Schritt näher ... ;) Sehr wahrscheinlich hast Du das Skript falsch "angepasst", vermutlich weil Du den Programmcode nicht ausreichend verstehst.

Wenn man sich mit VBS auskennt, kann man die wahrscheinlichen Problem-Stellen alleine durch lesen und verstehen des Programmcodes identifizieren. Sollte es komplizierter sein, dann kann man sich Debug-Ausgaben in den Skriptablauf einbauen z.B. mit ShowSystemAlarm oder Verwendung des Err-Objektes ( On Error ... , If Err.Number <> 0 ... )

Zuerst sorge dafür daß Du Runtime-Errors und Debug/ShowSystemAlarm-Ausgaben überhaupt sehen kannst: mache in ein Bild eine Meldeanzeige für Meldungen der Meldeklasse "System", dann kannst Du die Meldungen in Ruhe nachlesen und so auf die Problem-Ursache und Problem-Stelle schließen.
Debuggen von Skripten auf Comfort Panelen ist allerdings ziemlich schwierig (Programmänderungen müssen immer übersetzt und aufs Panel geladen werden) und kann speziell bei den Datei-Funktionen auch kaum auf einem PC simuliert werden. Hier muß man sehr stark mit dem eigenen Gehirn arbeiten... ;)

Harald
 
Zurück
Oben