mani: Bat-datei per php ausführen

Hallo!

Kann mir jemand sagen wie ich per PHP eine bat-datei ausführen kann?
ich hab schon mit exec und system probiert, das gibt mir aber nur die batdatei aus und führt sie nicht aus.

weiß irgendjemand wie ich das mache?

mfg. Mani

  1. Hello,

    Kann mir jemand sagen wie ich per PHP eine bat-datei ausführen kann?
    ich hab schon mit exec und system probiert, das gibt mir aber nur die batdatei aus und führt sie nicht aus.

    weiß irgendjemand wie ich das mache?

    Wo liegt denn die .bat-Datei? Liegt die auf dem Webserver, auf dem das PHP abläuft?

    Dann müsstest Du mit PHP eine Shell laden und dieser die Bat-Datei übergeben. Auf Windows heißen die Shells z.B. command.com oder cmd.com.

    Schau Dir doch einfach mal die User Contributed Notes (UCN = Bemerkungen anderer User) auf der PHP-Manual-Seite an
    http://de.php.net/manual/de/function.exec.php
    http://de.php.net/manual/de/function.shell-exec.php
    und nicht vewrgessen:
    http://de.php.net/manual/de/function.escapeshellcmd.php

    Liebe Grüße aus Syburg

    Tom vom Berg

    --
    Nur selber lernen macht schlau
    http://bergpost.annerschbarrich.de
    1. Hi,

      geht das denn nicht auch mit system(""); ?

      Gruß,
      Wlad

      1. Hello,

        geht das denn nicht auch mit system(""); ?

        kommt darauf an, was man erreichen will.
        Wenn man alle Ausgaben der Stapeldatei auffangen will, ist exec() besser geeignet.
        System() merkt sich nur die letzte Zeile.

        Liebe Grüße aus Syburg

        Tom vom Berg

        --
        Nur selber lernen macht schlau
        http://bergpost.annerschbarrich.de
        1. Ich habs geänder und ausgeführt.

          er gibt mir folgendes aus.

          Result: C:\Programme\xampp\htdocs\kassensystem>type rechnung1.txt  1>lpt2
          Error: 1
          C:\Programme\xampp\htdocs\kassensystem>type rechnung1.txt  1>lpt2

          1. Hello,

            Ich habs geänder und ausgeführt.

            er gibt mir folgendes aus.

            Result: C:\Programme\xampp\htdocs\kassensystem>type rechnung1.txt  1>lpt2

            liegt "rechnung1.txt" denn auch in dem Verzeichnis "C:\Programme\xampp\htdocs\kassensystem"?

            Es sieht mir schon so aus, als würde exec hier ausgeführt, aber als könnte eine der Dateien/Kanäle nicht gefunden werden, also entweder rechnung1.txt, oder der Kanal für den Drucker. Hast Du den Druckerkanal überhaupt für "DOS" aktiviert? Da muss ein passendes Capturing eingerichtet sein!

            Liebe Grüße aus Syburg

            Tom vom Berg

            --
            Nur selber lernen macht schlau
            http://bergpost.annerschbarrich.de
            1. Hello,

              »» Ich habs geänder und ausgeführt.
              »»
              »» er gibt mir folgendes aus.
              »»
              »» Result: C:\Programme\xampp\htdocs\kassensystem>type rechnung1.txt  1>lpt2

              ja die datei liegt in dem verzeichniss.
              der drucker muss eigentlich passen, denn wenn ich die bat ausführe dan funkts auch.

              ich hab jetzt die bat datei auf copy umgeschrieben und bekomme folgendes ergebnis zurück.

              [code lang=html]Result:         0 Datei(en) kopiert.  
              Error: 1  
                
              C:\Programme\xampp\htdocs\kassensystem>copy rechnung1.txt lpt2  
                      0 Datei(en) kopiert.
              ~~~[/code]  
                
              
              
              1. Hello,

                ich hab jetzt die bat datei auf copy umgeschrieben und bekomme folgendes ergebnis zurück.
                [code lang=php][code lang=html]Result:         0 Datei(en) kopiert.
                Error: 1

                Und was sagt Dir das?
                Welches ist denn das relevante Arbeitsverzeichnis für die Batch-Datei?
                Vielleicht solltest Du das in der Batch-Datei auch setzen?
                Oder was würdest Du alternativ davon halten, in der Batch-Datei einen qualifizierten Pfad zur Textdatei anzugeben?

                Mehr vorkauen kann ich es Dir nun nicht mehr!

                Liebe Grüße aus Syburg

                Tom vom Berg

                --
                Nur selber lernen macht schlau
                http://bergpost.annerschbarrich.de
                1. Ich habs vorhin schon mal probiert ich habs aber nun noch mal geändert.

                  die bat-datei sieht nun so aus:
                  copy C:\Programme\xampp\htdocs\kassensystem\druck\rechnung1.txt lpt2

                  ich habe die bat nun in den 2 verzeichnissen liegen damit wirklich nichts mehr schief gehen kann:
                  C:\Programme\xampp\htdocs\kassensystem\druck\ C:\Programme\xampp\htdocs\kassensystem\

                  als ergebniss bekomme ich nun:

                  Result:         0 Datei(en) kopiert.  
                  Error: 1  
                    
                  C:\Programme\xampp\htdocs\kassensystem>copy C:\Programme\xampp\htdocs\kassensystem\druck\rechnung1.txt lpt2  
                          0 Datei(en) kopiert.
                  

                  funken tuts trozdem nicht!

                  1. Hello,

                    ist die Datei rechnung1.txt in dem Moment, wo die Batch-Datei ausgeführt wird, geschlossen?

                    Wo wird denn diese Textdatei erzeugt? Im selben Script?
                    Dann wäre viellicht

                    fclose()

                    dein Freund?

                    Liebe Grüße aus Syburg

                    Tom vom Berg

                    --
                    Nur selber lernen macht schlau
                    http://bergpost.annerschbarrich.de
                    1. ja die datei ist geschlossen.
                      ich habe jetzt die bat datei so umgeschrieben das alle textdateien in dem ordner gedruckt werden und habe 2 textdateien per hand angelegt.

                      es wird jedoch die selbe meldung zurückgegeben und nichts gedruckt.

                      1. Hello,

                        es wird jedoch die selbe meldung zurückgegeben und nichts gedruckt.

                        Ist der Drucker auch freigegeben für den PHP-User?

                        Wie ist die genaue Systemumgebung?

                        Liebe Grüße aus Syburg

                        Tom vom Berg

                        --
                        Nur selber lernen macht schlau
                        http://bergpost.annerschbarrich.de
                        1. Was meinst du mit PHP-User?

                          Ich habe eine Virtuelle XP-Maschine und greife damit auf einem Netzwerkdrucker HP Business Inkjet 1200n zu.
                          Ich habe ihn mit dem befehl net use angefügt.

                          auf der xp-maschine läuft sonst kein anderes programm oder virenscanner oder so.

                          ich greife direkt auf der xp-maschine auf die dateien zu.

    2. Die datei lieg auf dem server.
      die datei liegt in einem unterverzeichniss.
      die bat-datei druckt dateien aus.
      wenn ich die batdatei direkt ausführ mach sie das, was ich will.

      mit dem command.bat kenn ich mich nicht wirklich aus.
      Kannst du mir evtl. sagen wie das skript aussehen soll?

      Dankend im vorraus

      Mani

      1. Hello,

        mit dem command.bat kenn ich mich nicht wirklich aus.
        Kannst du mir evtl. sagen wie das skript aussehen soll?

        Exec() kann mit einer Stapeldatei nichts anfangen. Nur die Shell (cmd.exe) kann damit etwas anfangen. Also musst Du mit exex() die cmd.exe aufrufen und dieser als Parameter den Namen der Stapeldatei übergeben. Ungefähr so:

        $ret = exec("c:\windows\system32\cmd.exe /c '$batchFileToRun'", $_output);

        Liebe Grüße aus Syburg

        Tom vom Berg

        --
        Nur selber lernen macht schlau
        http://bergpost.annerschbarrich.de
        1. Ich habs nun mit folgendem code erfolglos versucht!

          exec("c:\windows\system32\cmd.exe /c 'C:\Programme\xampp\htdocs\kassensystem\druck\druck.bat'", $_output);

          entweder bin ich zu blöd oder das funkt wirklich nicht?

          1. Hello,

            Ich habs nun mit folgendem code erfolglos versucht!

            exec("c:\windows\system32\cmd.exe /c 'C:\Programme\xampp\htdocs\kassensystem\druck\druck.bat'", $_output);

            ^         ^     ^      ^            ^     ^

            entweder bin ich zu blöd oder das funkt wirklich nicht?

            Ich verkneif mir die Antwort lieber ;-)

            Entweder die Backslashes verdoppeln, damit sie als normales Zeichen angesehen werden im doppelt gequoteten String, oder aber vorher zuweisen:

            $batch = 'C:\Programme\xampp\htdocs\kassensystem\druck\druck.bat';
              $res   = exec("c:\windows\system32\cmd.exe /c '$batch'", $_output);

            if ($res = 0)  ## kein Fehler stattgefunden
              {
                  echo "<pre>\r\n";
                  foreach ($_output as $line)
                  {
                      echo htmlspecialchars($line)."\r\n";
                  }
                  echo "<pre>\r\n";
              }

            Probier das nochmal aus.

            Liebe Grüße aus Syburg

            Tom vom Berg

            --
            Nur selber lernen macht schlau
            http://bergpost.annerschbarrich.de
            1. Hello,

              if ($res == 0)  ## kein Fehler stattgefunden

              --

              Da hate ich jetzt was vergessen. Vergleich natürlich mit zwei "="

              Liebe Grüße aus Syburg

              Tom vom Berg

              --
              Nur selber lernen macht schlau
              http://bergpost.annerschbarrich.de
              1. also als ersters will ich mich mal für deine bemühungen bedanken.
                ich bin einfach zu dämlich dafür, es klappt einfach nicht.
                kann sein das dieses am server irgendwie eingeschalten werden muss oda so?

                mfg mani

                1. Hello,

                  also als ersters will ich mich mal für deine bemühungen bedanken.
                  ich bin einfach zu dämlich dafür, es klappt einfach nicht.
                  kann sein das dieses am server irgendwie eingeschalten werden muss oda so?

                  Bekommst Du denn Fehlermeldungen?
                  Wie sind die Zugriffsrchte auf die Verzeichnisse vergeben?
                  Darf der PHP-Interpreter überall zugreifen?

                  Liebe Grüße aus Syburg

                  Tom vom Berg

                  --
                  Nur selber lernen macht schlau
                  http://bergpost.annerschbarrich.de
            2. Hello,

              ok, auf ein Neues!

              <?php    ### batch.php ###

              error_reporting(E_ALL);

              $batch = 'Q:\exec\druck.bat';
                $res   = exec("c:\winnt\system32\cmd.exe /c "$batch"", $_output, $error);

              echo "<pre>\r\n";
                echo "Result: $res \r\n";
                echo "Error: $error \r\n";

              foreach ($_output as $line)
                {
                    echo htmlspecialchars($line)."\r\n";
                }
                echo "<pre>\r\n";

              ?>

              So hat es nun bei mir funktioniert.
              Achte darauf, dasss mein Windows "winnt" heißt.
              Windows verträgt in der Befehlszeile keine einfachen Anführungszeichen zum Binden des Batch-Befehls. Das mussten auch doppelte sein.

              Liebe Grüße aus Syburg

              Tom vom Berg

              --
              Nur selber lernen macht schlau
              http://bergpost.annerschbarrich.de
              1. mir wird nun die batdatei ausgegeben aber nich wirklich ausgeführt.

                so ein sch....!

                kann man das nicht irgendwie anders machen?

                1. Hello,

                  mir wird nun die batdatei ausgegeben aber nich wirklich ausgeführt.

                  Bei mir funktioniert das einwandfrei.
                  Ich hatte Dir aber auch extra gesagt, dass Du die Pfade zu den Files kontollieren sollst.
                  Wenn es eine Normalinstallation ist, heißt das Verzeichnis vermutlich nicht "winnt" sondern "windows"

                  Du solltest nochmal alles zusammenkramen, sauber formatieren, ausprobieren, Fehlermeldungen einsammeln und dann hier posten. Insbesondere der $error-Value interessiert mich.

                  Liebe Grüße aus Syburg

                  Tom vom Berg

                  --
                  Nur selber lernen macht schlau
                  http://bergpost.annerschbarrich.de