gant: system() unter Win32

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

  1. 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.

    1. 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

      1. 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

    2. 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

      1. 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

        1. 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

          1. 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

            1. 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

              1. 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