Page 1 of 1

Die "Batch-Filecommands" des Matrix42 Package Robot (MPR)

Posted: 13. Jul 2016, 13:43
by Theo_Gottwald
Neben der Möglichkeit der Bedienung von GUI's (Anwendungs-Oberflächen)
bietet der MPR auch ein komplettes Set an Dateibefehlen, mit denen man alle grundlegenden Datei-
und Batch-Operationen abbilden kann.

Man kann dadurch Dateibefehle und Oberflächenbefehle in einem Skript kombinieren.
Man kann auch reine Batch-Skripte mit dem MPR erststellen, und auch dafür spricht Einiges.
Und das ist das Thema in diesem Beitrag.

Doch sehen wir uns zunächst einfach mal die Datei-Befehle an.

#########################################################################
Für Dateien*:
#########################################################################

Code: Select all

DEL\[Daten]" für "Delete", 
DAF\[Daten]" für "DeleteAllFiles"
REN\[Daten]" für Rename, 
MOV\[Daten]" für Move.


FCP\[Daten]" für "FileCoPy", 
FCE\[Daten]" für "FileCopy if Exists"
CIP\[Daten]" für "Copy If Possible" 
CIO\[Daten]" für "Copy If Older", 
CEO\[Daten]" für "Copy if Exists and Older"
RIO\[Daten]" für "Replace If Older"

UEF\[Daten]" für "Update Existing Files"
OUF\[Daten]" für "OverwriteUsedFiles", 
IFU\" für "IfFileUsed", "EFU\" für "EndFileUsed"

SFA\[Daten]" für "SetFileAttribute"
RFA\[Daten]" für "RemoveFileAttributes"
RIF\[Daten]" für ReplaceInFile", 

' Und speziell für Textdateien/Dateilisten
RLF\[Daten]" für "RemoveLinesfromFile",
RPL\[Daten]" für "RePlaceLine"
LFF\[Daten]" für "LineFromFile"
LFT\[Daten]" für "LineFromText",
GLN\[Daten]" für "GetLineNumber".
In Kurz: Alles da!

#########################################################################
Für Verzeichnisse:
#########################################################################

Code: Select all

MKD\[Daten]" für MakeDirectory. (Erstellt auch kompletten Verzeichnisbaum in einem Schritt!)
RMD\[Daten]" für ReMoveDirectory.

DCP\[Daten]" für "DirCoPy"
DRD\([Daten])" für "DuplicateRemoteDirectory".

Synchronisieren zum Beispiel für Backups:

"SYN\[Daten]" für "Synchronize Directories",
"SAS\[Daten]" für "Synchronize All Subdirectories",
"SES\[Daten]" für "Synchronize Existing Subdirectories".

#########################################################################
' WARUM den MPR für Batch-Prozesse nutzen?
#########################################################################
Im Folgenden 6 gute Gründe,WARUM man den "Package Robot" auch für Dateioperationen verwenden sollte.


#########################################################################
1. Abbarbeitung der Skripte mit Systemrechten im Hintergrund, die auch weiterlaufen wenn sich ein User abmeldet.
#########################################################################

Um das zu tun verwendet man im Skriptkopf einfach die Compiler-Direktiven:

Code: Select all

'#EXV:File
'#MAN:ra
und erstellt dann eine EXE-Datei aus dem Skript mit "EXE erstellen".
Startet man ein so erstelltes Skript, dann wird dieses Skript (Zum Beispiel eine Datensicherung) mit Systemrechten im Systemaccount gestartet.
Das Skript läuft dann auch weiter, wenn sich ein angemeldeter User abmeldet. Oder ein anderer User anmeldet.
Und der sich wieder abmeldet. Das Skript überlebt fast alles solange der PC nicht ausgeschaltet wird.
Man kann sogar andere Skripte testen während das läuft, denn selbst wenn man die "Killrobots.exe" anwendet, kann diese den "SYSTEM-Robot" nicht ausschalten.
Ich nutze das immer und finde es sehr nützlich.

#########################################################################
2. Möglichkeit die Pfade mit Spezialordnern zu definieren
#########################################################################

Der MPR bietet eine ganze Reihe Spezialordner. Dabei gibt man den Ordnerpfad nicht direkt an sondern schreibt zum Beispiel:

"?cstartprog" anstatt "c:\dokumente und einstellungen\All Users\startmenü\programme" (Common)

Dadurch hat der Robot dann zur Laufzeit die Möglichkeit den "richtigen Pfad" auf dem Computer zu ermitteln, wo er gerade läuft. Es stehen alle Spezialordner (Liste unten) zur Verfügung.

Weitere Spezialordner stehen über den Befehl "SFP\" zur Verfügung. Wer den Befehl noch nie benutzt hat,
einfach mal "SFP\" im Editor eingeben, es klappt dann eine Liste mit ca. 30 weiteren Spezialordnern auf,
angefangen von "(all Users)\Admintools" über "CD Burn Area" bis "Userprofile".

Wie gesagt zusätzlich zu diesen hier:

Code: Select all

"?wi"		= "c:\windows"         	*)
"?ws"		= "c:\windows\system32" auf 32-Bit, "c:\windows\syswow64" auf 64-Bit
"?ws64"		= "c:\windows\system32" auf 64-Bit-Systemen
"?wd"		= Laufwerksbuchstabe des Windows-Verzeichnisses
"?desktop"		= "c:\dokumente und einstellungen\[user]\desktop"
"?cdesktop"	= "c:\dokumente und einstellungen\All Users\desktop" (Common)
"?auto"		= "c:\dokumente und einstellungen\[user]\startmenü\programme\autostart"
"?cauto"		= "c:\dokumente und einstellungen\All Users\startmenü\programme\autostart" (Common)
"?fonts"		= "c:\windows\fonts"
"?startmen"	= "c:\dokumente und einstellungen\[user]\startmenü"
"?cstartmen"	= "c:\dokumente und einstellungen\All Users\startmenü" (Common)
"?sendto"		= "c:\dokumente und einstellungen\[user]\sendto"
"?progs"		= "c:\programme" auf 32-Bit-Systemen, "c:\programme (x86)" auf 64-Bit
"?progs64"		= "c:\programme" auf 64-Bit-Systemen
"?temp"		= "c:\dokumente und einstellungen\[user]\lokale einstellungen\temp"	**)
"?access"		= "c:\dokumente und einstellungen\[user]\startmenü\programme\zubehör"
"?progacc"		= "c:\programme\zubehör"
"?startprog"	= "c:\windows\startmenü\programme"
"?commonfiles"	= "c:\programme\gemeinsame dateien" unter Win32 oder
                   "c:\programme (x86)\gemeinsame dateien" unter Win64
"?commonfiles64"	= "c:\programme\gemeinsame dateien" (nur unter Win64!)
"?startprog"	= "c:\dokumente und einstellungen\[user]\startmenü\programme"
"?cstartprog"	= "c:\dokumente und einstellungen\All Users\startmenü\programme" (Common)
"?ql"		= "c:\dokumente und einstellungen\[user]\Anwendungsdaten\Microsoft\Internet Explorer\Quick Launch"
			  (Schnellstartleiste)	

"?remdir"		= Pfad zum Installationsverzeichnis von Package Robot

"?pfad"		= Verzeichnispfad der aktuellen Remote-Datei	***)
"?exepfad"		= Verzeichnispfad der (aktuellen) Remote.Exe	***)
"?RemExe"		= Remote-Programm incl. Pfad
"?lw"		= Laufwerk des Remoteprogramms			***)
"?cdrom"		= Laufwerksbuchstabe des CD-ROMs
#########################################################################
3. Man kann eigene Variablen verwenden
#########################################################################

Variablen sind "Abkürzungen" für Texte oder Zahlen. Kann man das so sagen?
Dabei werden beim Robot Variablen nur definiert, die Deklaration (ob Text oder numerisch) mnacht der Robot selbst.

Das sieht typischerweise so aus:

Code: Select all

' Pfad-Definition
VAR\$$PAT=?temp\MyTemp\MyTempfile.txt

' Numerische Variable, Integer (keine Nachkommastellen)
VAR\$$NUM=25

' Numerische Variable, Fließpunkt
VAR\$$NUM=0.75

' Doch dabei muß man aufpassen:
VAR\$$NUM=0.75*13
ergibt nun nicht etwa 9.75, sondern ist einfach nur eine Zeichenkette.
Wenn man 9.75 haben will muß man statt VAR\ den Befehl CAL\ verwenden.
Also so:

Code: Select all

CAL\$$NUM=0.75*13
' Das ergibt 9.75
MBX.$$NUM
Das allein wäre natürlich nur zusätzlicher Schreibaufwand.
Interessant wird das Variable Design erst dadurch, dass man auch Variablen verschachteln kann.
Hier ein Beispiel wie ein Pfad aus merheren Variablen zusammengesetzt wird.

Und natürlich kann das auch mit Schleifen und IF-Abfragen kombiniert werden.

Code: Select all

FOR\$$NUM|1|10
   VAR\$$ROT=D:\
   VAR\$$PAT=Backup_
   CAL\$$FIN=99+$$NUM 
   VAR\$$TAR=$$ROT$$PAT$$FIN\File.txt
   SBT\2|$$TAR
NXT\
Und nun sind wir da wo es Schreibarbeit einspart!

#########################################################################
4. Man kann FEM\, FEF\ und FEL\ verwenden
#########################################################################

Jetzt wirds scheinbar ein wenig komplizierter, aber nur zum Schein.
Dieses kleine Skript einfach mal laufen lassen, es erklärt schon einiges.

Code: Select all

VAR\$$PAT=C:\
FEF\$$PAT|*.*|Doit|$$TMP
MBX\Ready

@
:Doit
SBT\2|$$TMP
@
Dabei zeigt der Robot nacheinander alle Dateien an, die im Root-Pfad von C:\ liegen.
Eine nach der anderen. Mit eine klitzkleinen Änderung werden es alle Verzeichnisse:

Code: Select all

FEF\$$PAT|*.*|Doit|$$TMP#
Genau, nur einfach das "#" hintendran schreiben und schon bekommt man sozusagen eine Aufzählung aller Unterverezeichnisse.
Und kann dann in ":Doit" mit denen etwas tun.

Schreibt man hingegen noch ein @ hintendran dann durchsucht der Robot auch noch ALLE Unterverezichnisse!

Code: Select all

' Rekursiv - alle Files
FEF\$$PAT|*.*|Doit|$$TMP@

' Rekursiv - alle Verzeichnisse
FEF\$$PAT|*.*|Doit|$$TMP@#
Achtung - das kann nun langsamer werden, da der Robot hier in zwei Schritten arbeitet.
Zunächste erstellt er intern eine Liste mit allen Einträgen (und das kann dauern je nach Festplatte),
dann erst ruft er mit jedem Eintrag aus der Liste das Unterprogramm "Doit" auf.

Mit nur diesem einen Befehl "FEF\" kann man Dateien und Verzeichnisse individuell bearbeiten.

Das gleiche System verwendet der Befehl "FEL\". Nur dass "FEL\" die Zeilen einer Textdatei "auflistet" und nicht die Dateien in einem Verzeichnis.
Das kann also typischerweise eine "Dateiliste" sein, die mittels FEL\ - Zeile für Zeile abgearbeitet wird.

"FEM\" bearbeitet Tabellen, die mit Trennzeichen versehen sind, typischerweise aus Excel (Tabellenkalkulation) und gespeichert als ".csv"-Datei.
Hier nimmt sich FEM\ dann jeden einzelnen abgetrennten Teil nacheinander vor.
Günstig wenn man die Daten von Excel oder Open Office exportiert hat und nun diese wie auch immer bearbeiten will.
Das kann auch wieder eine File- oder Serverliste sein.

#########################################################################
5. Verwendung von Abfragen wie IEF\ etc. und Strukturen wie SLC\
#########################################################################

Intelligente Skripte müßen auch mal selbst entscheiden was sie tun sollen.
Dazu kann man beim MPR ganz einfach Abfragen einbauen.

Eine mögliche Abfrage ist zum Beispiel "IEF\" - If Exist File.
IEF\ kann man nehmen um zu prüfen ob eine Datei oder ein Verzeichnis existiert.

Ob man nun nach einer Datei oder nach einem Verzeichnis prüft, entscheidet IEF\ anhand des letzten Zeichens.
Ist das ein "\" dann wird nach einem solchen Ordner gesucht.

Beispiel:

Code: Select all

IEF\name\
Ist da kein "\" an dem Datenteil, dann wird nach einer solchen Datei gesucht. Beispiel:
Beispiel:

Code: Select all

IEF\name.txt
Aber IEF\ kann noch mehr!

Sie können auch Wildcards (Platzhalter; "?", "*") verwenden, wenn Sie den genauen Datei/Verzeichnisnamen nicht kennen. Dann wird im Erfolgsfall der vollständige Pfad der (ersten) gefundenen Datei/des Verzeichnisses in der Zeichenfolge "$v1$" zurückgegeben. Verzeichnisse werden ohne abschließenden Backslash zurückgegeben!
Beispiele:

Code: Select all

IEF\c:\temp\temp.txt	'prüft, ob die Datei "c:\temp\temp.txt" existiert
... 
IEF\c:\temp\temp.*		'prüft, ob in "c:\temp\" eine Datei mit Namen "temp" existiert
... 
IEF\c:\temp\*.txt		'prüft, ob in "c:\temp\" eine beliebige Textdatei existiert
... 
IEF\c:\temp\*.*  		'prüft, ob in "c:\temp\" irgendeine Datei existiert
... 
IEF\c:\temp\.    		'prüft, ob das Verzeichnis "c:\temp\" existiert
'--------------
IEF\?auto\*close*
 '...             
EEF\
' liefert z.B. in "$v1$" die Zeichenfolge
C:\Dokumente und Einstellungen\Administrator\Startmenü\Programme\Autostart\Close.lnk 
Wenn wir das Skript oben um eine Abfrage erweitern sieht das so aus:

Code: Select all

:Doit
' Nur wenn das ein Verzeichnis ist, wird es gefunden. Wir brauchen also das "#" beim FEF\.
IEF\$$TMP\
   SBT\2|$$TMP existiert
ELSE
   SBT\2|$$TMP existiert nicht!
EEF\
@
Es gibt nun nicht nur FEF\ sondern eine große Auswahl an weiteren Abfragen:
Für die File-System Skripte sind diese besonders interessant:

Code: Select all

"IEF\[Daten]" für "IfExistsFile/Folder", "EEF\" für EndExistsFile/Folder
"IFF\[Daten]" für "IfFileFound", "EFF\" für "EndFileFound",
"IFS\[Daten]" für "IfFolderhasSubfolder", "EFS\" für "EndFolderhasSubfolder",
Neben der zweiseitigen Verzweigung, wo es also einen Eingang und zwei Mögliche Ausgänge gibt, bietet der MPR auch noch die "mehrseitige Auswahl".

Hier kann man beliebige logische Fälle ("CASES") im Skript abbilden. Zum Beispiel auch Netzwerke oder wenn man Dateien je nach Endung in andere Verzeichnisse umkopieren will.

Code: Select all

"SLC\[Daten]" für "SeLectCase", 
"CSE\[Daten]" für "CaSE", 
"CEL\[Daten]" für "CaseElse", 
"ESL\" für "EndSeLect", 
Hierzu nur ein kleines Beispiel: SELECT CASE mit Textvariablen (Strings)
Ein Beispiel mit Zahlen ist in der Hilfe bie SLC\.
Besonders zu beachten ist die Möglichkeit, das Vergleichsverfahren zu beeinflussen:

Code: Select all

|1 - IVC\-Vergleich
|2 - LIKE-Operator 
+  - Exakte Übereinstimmg
 default/keine Angabe: Übereinstimmung nicht case-sesitiv!
Beispiele zu SLC\ finden sie in der Hilfe ebenda.

#########################################################################
6. Der MPR bietet Spezialbefehlen die man sonst kaum hat
#########################################################################

Der MPR kann vieles was mit einfachen Batch Mittel so nicht ohne Weiteres geht.
Sehen Sie mal in die Hilfe, der MPR hat noch viele mehr (z.B. den Watchdog WDL\).

"WFF\[Daten]" für "WaitForFile",
Wenn Sie auf das Entstehen oder Verschwinden einer Datei warten müssen, verwenden Sie den Befehl "WFF\". Geben Sie dazu im Datenteil den Pfad zu dieser Datei an, wobei auch Platzhalter ("?", "*") eingesetzt werden können, um eine Gruppe von Dateien zu beschreiben. Optional können Sie - abgetrennt durch einen Senkrechtstrich ("|") noch eine Wartezeit in Sekunden als Timeout nach dem Dateipfad angeben.
Wenn Sie auf das Verschwinden warten wollen, schließen Sie den Datenteil mit dem Zeichen "!" ab.

"WFC\[Daten]" für "WaitForChange",
Sie möchten benachrichtigt werden, wenn jemand auf bestimmte Dateien/Ordner zugreift?
Mit "WFC\..." können Sie ein Verzeichnis samt seinen Unterverzeichnissen auf Änderungen an Dateien überwachen. Das Programm wird erst dann fortgesetzt, wenn eine irgendeine Änderung eingetreten ist. Im Datenteil ist der Pfad des zu überwachenden Verzeichnisses anzugeben, wobei Sie die unter "Spezialordner" aufgeführten Kürzel verwenden können.
Der Befehl läßt sich im Zusammenhang mit einer Schleife beispielsweise dazu benutzen, eine Sicherungskopie des Verzeichnisses immer aktuell zu halten.
HINWEIS:
Für die Überwachung wird eine separate Hilfs-Exedatei benutzt, um das Programm selbst nicht zu blockieren. Sie können also das Remote-Programm mehrfach zur Überwachung verschiedener Verzeichnisse starten, ohne daß sich Probleme ergeben.


Sie können einen Datei-Pfadnamen einfach in seine Bestandteile zerlegen. Das braucht man öfters.
Mit "GFT\" können Sie einen im Datenteil angegebenen kompletten Dateipfad in die Bestandteile
- Verzeichnis (ohne Backslash am Ende),
- Dateiname (ohne Endung) und
- Endung (sofern es eine gibt)
zerlegen. Die Token werden in Kleinbuchstaben in programminternen Variablen hinterlegt, auf die Sie wie folgt zugreifen können:

Code: Select all

$v2$ enthält das Verzeichnis,
$v3$ enthält den Dateinamen,
$v4$ enthält die Endung, 
$v5$ enthält das Root-Verzeichnis mit abschließendem Backslash und
$v6$ enthält den reinen Verzeichnisnamen ohne abschließenden Backslash.
Wenn es sich um einen Netzwerkpfad handelt, wird statt des Verzeichnisnamen in
$v6$ der Servername  mit abschließendem Backslash geliefert.
Wenn im Datenteil der Name eines (existierenden) Verzeichnisses übergeben wird, bleiben $v3$ und $v4$ leer.
Wenn Sie den Datenteil leer lassen, wird der Inhalt von "$v1$" als Dateipfad benutzt, wie er z.B. von "IEF\..." belegt wurde (siehe "IEF\"-Beispiel). HINWEIS: Der Befehl überprüft nicht die Existenz einer Datei! 

Beispiel: 
DVV\1+
GFT\e:wr6\remote.exe
@
Output:
$v2$=e:\wr6
$v3$=remote
$v4$=exe
$v5$=e:\
$v6$=wr6
Sie möchten zum Beispiel wissen wieviele Dateien in einem Verzeichnis sind?

"GDI\..." liefert Informationen über das im Datenteil angegebene Verzeichnis, und zwar

Code: Select all

in $v1$ die Anzahl der Dateien,
in $v2$ die Gesamtgröße der Dateien in Bytes,
in $v3$ den Namen der größten Datei,
in $v4$ die Größe der größten Datei,
in $v5$ den Namen der kleinsten Datei und
in $v6$ die Größe der kleinsten Datei.
Unterverzeichnisse werden nicht berücksichtigt.
Per Default werden alle Dateien einbezogen. Sie können jedoch Einschränkungen hinsichtlich der Attribute machen, indem Sie am Ende des Datenteils und abgetrennt durch einen Senkrechtstrich ("|") eine Ziffer angeben, die eine Summe aus folgenden Auswahlkriterien darstellt:
1 = keine schreibgeschützen Dateien,
2 = keine versteckten Dateien, und 
4 = keine Systemdateien, z.B.
GDI\?ws|7
Oder diese Spezialität:
"OUF\[Daten]" für "OverwriteUsedFiles", "IFU\" für "IfFileUsed", "EFU\" für "EndFileUsed".
Mit "OUF\..." können einzelne Dateien kopiert werden, die z.Z. in Benutzung sind. Es wird zunächst versucht, die angegebene Datei zu kopieren. Wenn das gelingt, verhält sich der Befehl wie "FCP\", d.h. die Arbeit ist erledigt. Wenn jedoch ein Zugriffsfehler auftrat, weil die Zieldatei in Benutzung war, wird ein Mechanismus eingeleitet, der sicherstellt, daß die Zieldatei bei nächster Gelegenheit mit der Quelldatei überschrieben wird. Das kann nur beim nächsten Bootvorgang geschehen.
Wenn ein Zugriffsfehler der o.g. Art auftrat, wird ein programminternes Flag gesetzt, das Sie mit dem Befehl "IFU\" abfragen können. Die zwischen "IFU\" und "EFU\" stehenden Befehle werden nur ausgeführt, wenn das Flag gesetzt ist.
Wenn das Flag gesetzt ist, müssen Sie selbst dafür sorgen, daß ein Neubooten stattfindet, bevor die überschriebene Datei genutzt werden kann (siehe "REB\" oder "WRS\").
Die Syntax für den Befehl lautet (ohne []):
OUF\[Existierende Datei]->[zu überschreibende Datei]

Soll eine existierende, aber in Benutzung befindliche Datei gelöscht werden, geben Sie nach dem Pfeil die Zeichenfolge "NUL" oder "nul" an:

Code: Select all

OUF\[Existierende Datei]->NUL
Beim Kopieren kann eine Datei auch umbenannt werden.


#########################################################################
' 7. Zusammenfassung Dateibefehle (Ohne Verzeichnisse)
#########################################################################

Zum Abschluß noch Mal eine Detaillierte Liste der wichtigsten Dateioperationen:

Code: Select all

- Existenz prüfen		"IEF\".
- löschen			"DEL\", DLF\", "DAF\".
- kopieren 			"FCE\", "FCP\", "CEO\", "CIO\", "CIP\", "RIO\".
- kurzen Dateipfad ermitteln	"GSP\".
- Pfad einer Datei zerlegen	"GFT\".
- Pfad konvertieren		"GSP\", "GLP\".
- Version prüfen		"GFV\", "IFV\", "IVO\".
- Warten auf Erscheinen		"WFF\", 
- Warten auf Verschwinden 	"WFM\".
- suchen			"IFF\".
- umbenennen,verschieben	"MOV\", "OUF\", "REN\". 			

- auf Änderung warten 		"WFC\".

- Informationen abfragen (Größe, Datum, Attribut)		"GFI\".
- Attribute ermitteln: 		"GFA\"
- Attribute entfernen/setzen 	"RFA\", "SFA\".
- Datum prüfen			"IFO\".
- Datum setzen			"FDT\".

- ausführen   			"EXE\", "EXX\", "EXW\", "EXS\", "EXP\", "EXR\", "EXO\".
- Pfad einer registrierten Exe-Datei ermitteln 		"GEP\".

- auswählen, öffnen (Dialog)	"DDF\".

- lesen				"CFI\", "CFF\", "LFF\".
- schreiben			"ATF\", "CTF\", "CTI\","OUF\", "UEF\", "IFU\".

- Liste erstellen		"CSF\".     
- komprimieren			"ZIP\", "UNZ\".

- Prüfsumme ermitteln		"GMD\".
- Sprache prüfen		"GFL\", "IFL\", "GLT\".

- downloaden 			"DLF\", "FTP\".
- uploaden			"FTP\".

- Zählen von Dateien		"GFN\", "FCT\".
- Zeilenanzahl ermitteln	"GLN\".
- Zeilen lesen, löschen, ändern	"LFF\", "RIF\", "RLF\", "RPL\".
- Zeilen verarbeiten		"FEL\", "EFE\".
Datei die in Benutzung ist überschreiben (Windows-Mechanismus)  "OUF\", 
Feststellen ob Datei in Benutzung ist 	"UEF\", "IFU\".
Und last - not least:
Mit "SCF\..." können Sie das aktuelle Verzeichnis des Rechners auf das im Datenteil angegebene setzen,
wobei gleichzeitig das aktuelle Laufwerk gewechselt wird, falls notwendig.

FAZIT:
Der MPR bietet alle Befehle die man benötigt um auch Dateioperationen perfekt zu skripten.
Und er bietet dabei Sicherheit (WFF\, IEF\ etc.) und Komfort (IFF\, WFC\, SYN\ etc.).