system() unter Win32
gant
- perl
Hallo,
Ich möchte auf einem Win32 System unter bestimmten Bedingungen Dateien von A nach B kopieren. Dazu verwende ich system().
Ist folgende Anwendung der Funktion korrekt?
...
system("copy A:/pfad/$filename c:/pfad/");
...
Thanx und Gruss
gant
Halihallo
Ich möchte auf einem Win32 System unter bestimmten Bedingungen Dateien von A nach B kopieren. Dazu verwende ich system().
Ist folgende Anwendung der Funktion korrekt?
Die Anwendung ist korrekt, aber es geht noch etwas korrekter ;)
Ich sehe nirgendwo etwas von Bedingungen.
...
system("copy A:/pfad/$filename c:/pfad/");
...
system('copy', "a:/pfad/$filename", "c:/pfad/*.*");
die einzelnen Parameter sollten in einzelnen Strings stehen. Das ist die korrektere Anwendung von system.
Hoffe, das das Hilft
Philipp
PS: Ich hätte gerne noch Backslashes gemacht, aber ich wusste und weiss noch immer nicht, wie man die auf dem Mac macht ;)
Es funktioniert aber auch mit den "normalen" Slashes.
Hi!
system('copy', "a:/pfad/$filename", "c:/pfad/*.*");
PS: Ich hätte gerne noch Backslashes gemacht, aber ich wusste und weiss noch immer nicht, wie man die auf dem Mac macht ;)
Es funktioniert aber auch mit den "normalen" Slashes.
Halt, an dieser Stelle nicht! Zwar versteht das Windowssystem selbst (und sogar DOS seit 2.0) den normalen Slash genauso wie den Backslash als Verzeichnisseparator, aber das Anwendungsprogramm copy (wenn auch eigentlich ein builtin Kommando des DOS-Prompts) interpretiert den / als Optionskennzeichen, das was unter Unix normalerweise das - ist. Hier muessen also unbedingt \ verwendent werden. Und da in Double quotes ("), muessen diese als \ geschrieben werden.
So long
Halihallo
system('copy', "a:/pfad/$filename", "c:/pfad/*.*");
PS: Ich hätte gerne noch Backslashes gemacht, aber ich wusste und weiss noch immer nicht, wie man die auf dem Mac macht ;)
Es funktioniert aber auch mit den "normalen" Slashes.
Halt, an dieser Stelle nicht! Zwar versteht das Windowssystem selbst (und sogar DOS seit 2.0) den normalen Slash genauso wie den Backslash als Verzeichnisseparator, aber das Anwendungsprogramm copy (wenn auch eigentlich ein builtin Kommando des DOS-Prompts) interpretiert den / als Optionskennzeichen, das was unter Unix normalerweise das - ist. Hier muessen also unbedingt \ verwendent werden. Und da in Double quotes ("), muessen diese als \ geschrieben werden.
Oh, danke für die Berichtigung, habe ich nicht gewusst (ich benutzte immer den Backslash->keine_probleme)
Viele Grüsse
Philipp
Hallo,
system("copy A:/pfad/$filename c:/pfad/");
system('copy', "a:/pfad/$filename", "c:/pfad/*.*");
die einzelnen Parameter sollten in einzelnen Strings stehen. Das ist die korrektere Anwendung von system.
Ist eigentlich so oder so möglich.
PS: Ich hätte gerne noch Backslashes gemacht, aber ich wusste und weiss noch immer nicht, wie man die auf dem Mac macht ;)
Es funktioniert aber auch mit den "normalen" Slashes.
Da mit System ein externes Programm aufgerufen wird, wird dadurch die Perl-Welt verlassen. Ab diesem Zeitpunkt sind System-Konventionen zu beachten.
Daher müssen die Slashes (/) durch Backslashes() ersetzt werden, was allerings dazu führt, daß es unter Windows
system('copy', "a:\pfad\$filename", "c:\pfad\*.*");
heißen muß.
Alternativ läßt sich natürlich auch das Perl-Modul File::Copy einsetzen, allerdings muß man sich das mit den Wildcards dabei abschminken. Aber dafür gibt es ja auch noch Module;-)
Grüße
Klaus
Halihallo
system('copy', "a:/pfad/$filename", "c:/pfad/*.*");
die einzelnen Parameter sollten in einzelnen Strings stehen. Das ist die korrektere Anwendung von system.
Ist eigentlich so oder so möglich.
klar. Aber mit der Übergabe eines Arrays statt eines Strings ist es eben "schöner" und auch sicherer. Viele Dokumentationen warnen vor der Übergabe der Parameter ohne Arrays.
Alternativ läßt sich natürlich auch das Perl-Modul File::Copy einsetzen, allerdings muß man sich das mit den Wildcards dabei abschminken. Aber dafür gibt es ja auch noch Module;-)
Wäre sicher die "elegantere" Methode. Ich halte es auch für besser, wenn man perl-eigene Lösungen verfolgt, statt auf das System auszuweichen; wenn man später ein programm auf ein anderes System portiert, hat man bei perl-eigenen Lösungen weniger Schwierigkeiten.
Viele Grüsse
Philipp
Hi Philipp,
Alternativ läßt sich natürlich auch das Perl-Modul File::Copy
einsetzen, allerdings muß man sich das mit den Wildcards dabei
abschminken. Aber dafür gibt es ja auch noch Module;-)
Wäre sicher die "elegantere" Methode. Ich halte es auch für besser,
wenn man perl-eigene Lösungen verfolgt, statt auf das System
auszuweichen; wenn man später ein programm auf ein anderes System
portiert, hat man bei perl-eigenen Lösungen weniger Schwierigkeiten.
das kommt halt immer auf die Aufgabenstellung an.
Ich hatte mal eine Aufgabenstellung, wo ich per CGI-Skript Windows-
Batch-Dateien generieren mußte, die dann von einem separaten Task-
Scheduler ausgeführt wurden (Windows Scripting Host gab es noch nicht
und war später auch nicht mächtig genug - wir brauchten etwas Eigenes;
die generierten, relativ einfachen Kommandofolgen wollten wir nicht
selbst in Perl haben, weil unsere Kunden sie verstehen oder ggf. sogar
ändern können sollten - die Batch-Dateien sind per Browser lesbar und
können benutzerdefinierte Exits aufrufen).
Das in diesen Batch-Files aufgerufene Programm ist definitiv Windows-
basiert (es nutzt eine firmeneigene API, die es nur für Windows gibt).
Deshalb durfte ich genau diese 'backspacigen' Kommandos erzeugen - nur
daß ich sie nicht an "system" übergeben, sondern eben in die Batch-Datei
schreiben mußte.
Viele Grüße
Michael
Halihallo Michael
Wäre sicher die "elegantere" Methode. Ich halte es auch für besser,
wenn man perl-eigene Lösungen verfolgt, statt auf das System
auszuweichen; wenn man später ein programm auf ein anderes System
portiert, hat man bei perl-eigenen Lösungen weniger Schwierigkeiten.
das kommt halt immer auf die Aufgabenstellung an.
[...]
Ist ja ein ziemlich exotisches Problem, was du da hattest ;)
In dieser Aufgabenstellung ist es ja klar, dass du auf externe Programme zugreifen musst (beziehungsweise diese generieren musst), das ist ja eben _ansich_ die Aufgabenstellung. Ist jedoch in der Aufgabenstellung nichts von einer Methode genannt, wie ein bestimmter Prozess abgearbeitet werden soll, sollte man den Prozess nach Möglichkeit "allgemein" halten; d. h. auch Platformunabhängig und d. h. => perl-Module statt system-Programme.
Die Aufgabenstellung von gant lautete ja einfach : "kopiere eine Datei" und nicht "kopiere eine Datei mit dem DOS-Kommando 'copy'", somit sollte man dies "allgemeiner" lösen (ist zumindest mein Vorschlag).
Wie gesagt: Für deine Aufgabenstellung war's sinnvoll, da sie die Verwendung von systemabhängigen, externen Programmen vorschrieb. Ist dies jedoch nicht der Fall, sollte man es unterlassen (meiner Meinung nach).
Viele Grüsse
Philipp
Hallo Philipp,
Ist ja ein ziemlich exotisches Problem, was du da hattest ;)
Nichts in der EDV-Welt ist zu exotisch um nicht automatisiert zu werden.
Beispiel:
Ich schreibe gerade an einer Applikation für den Nokia Communicator. Abgesehen davon, daß das SDK selbst recht ergiebigen Gebrauch von Perl macht, habe ich mir meine Arbeit damit automatisiert.
Neben einem C++-Code-Generator sind es inzwischen eine Menge andere Tools, wleche so im laufe der Zeit entstanden sind.
Eines erzeugt aus einer Excel-Tabelle, in der die verschiedenen Übersetzer die im Programm verwendeten Texte eingefügt haben, entsprechende Header-Dateien.
Eines bilden eine Wrapper für den Buildprozess.
Ein anderes ist für die entsprechende Konfiguration des Emulators zuständig.
Ein anderes kopiert die notwendigen Dateien für Erzeugung die Installationsdateien zusammen, erzeugt noch entsprechende Steuerdateien für verschiedene Sprachen und dann auch die Setup-Dateien.
usw. usf.
Und weil dabei auch diverse native Programme aufgerufen werden, müssen diese per system gestartet werden, und da sind halt Backslashes Plicht.
Wie gesagt: Für deine Aufgabenstellung war's sinnvoll, da sie die Verwendung von systemabhängigen, externen Programmen vorschrieb. Ist dies jedoch nicht der Fall, sollte man es unterlassen (meiner Meinung nach).
Ach weißt Du, so eng solltest Du das dann auch nicht sehen. Bevor ich irgendwie mit File::Find und File::Copy herumpopel, mach ich auch mal ein system('xcopy'...).
Wenn ich weiß, daß es sowieso nur unter Windows Sinn macht, dann ist mir Plattformunabhängigkeit ziemlich wurscht.
Allerdings gibt es dann genug ander Fälle, wo das wirklich wichtig ist. Ich versteh zum Beispile nicht immer, warum so viele noch sendmail in Perlscripts einsetzen, obwohl es auch ohne gehen würde. Aber es mag auch dafür Gründe geben, warum das so ist.
TMTOWTDI
Grüße
Klaus
Halihallo
Ist ja ein ziemlich exotisches Problem, was du da hattest ;)
Nichts in der EDV-Welt ist zu exotisch um nicht automatisiert zu werden.
Das brauchst du mir nicht zu sagen, ich liebe es Prozesse zu automatisieren ;)
Ich bin der Automatisator in Person ;-)
Beispiel:
[...]
usw. usf.
Uii, ja, klingt ziemlich durchautomatisiert ;-)
Ich hatte früher so 'ne Phase (im Moment beschränkt sich die Tätigkeit auf Firmenprojekte), als ich noch vermehrt mit Borland Pascal gearbeitet habe ;)
Und weil dabei auch diverse native Programme aufgerufen werden, müssen diese per system gestartet werden, und da sind halt Backslashes Plicht.
Was sage ich denn??? - Wenn's die Aufgabenstellung erfordert, muss es logischerweise auch so sein! - Aber wenn _nicht_, dann _sollte_ man sich der _allgemeineren_ Methode "fügen".
Wie gesagt: Für deine Aufgabenstellung war's sinnvoll, da sie die Verwendung von systemabhängigen, externen Programmen vorschrieb. Ist dies jedoch nicht der Fall, sollte man es unterlassen (meiner Meinung nach).
Ach weißt Du, so eng solltest Du das dann auch nicht sehen. Bevor ich irgendwie mit File::Find und File::Copy herumpopel, mach ich auch mal ein system('xcopy'...).
Das ist klar. Wenn's nur um Dateien kopieren geht, is alles IO. Es war eine allgemeine Anmerkung/Tip. Aber wenn's dann keine Umstände macht, sollte man sich des anderen bedienen. Zudem: Ich hasse das Anwenden von Fertigprodukten, selbst-programmieren macht doch viel mehr Spass, nicht? - Solange es das Zeitfenster des Auftrages erlaubt, programmiere ich gerne alles selber; auch wenn ich das Rad immer von neuem erfinde; ich erfinde wenigstens und bin stolz darauf ;-)
Wenn ich weiß, daß es sowieso nur unter Windows Sinn macht, dann ist mir Plattformunabhängigkeit ziemlich wurscht.
Klar! - Da wiederspreche ich auf _keinen_ Fall.
Allerdings gibt es dann genug ander Fälle, wo das wirklich wichtig ist. Ich versteh zum Beispile nicht immer, warum so viele noch sendmail in Perlscripts einsetzen, obwohl es auch ohne gehen würde. Aber es mag auch dafür Gründe geben, warum das so ist.
Jetzt muss ich auch noch gestehen, dass ich gar nicht anders bin:
Ich bin so einer, im Ernst. Ich mag sendmail einfach ;-)
Nun gut, wenn ich es ändern müsste (z. B. wenn wir auf Win2k-Server umsteigen, oder was auch immer), dann hätte ich das ganze System (egal wieviele Programme oder Code-A4-Seiten) in 5 minuten umgestellt. Für den Mailversand gibt's ein globales Modul, welches von allen Programmen verwendet wird <punkt>.
Viele Grüsse
Philipp