Stefan Bion: Aufruf von Betriebssystem-Kommandos mittels backquotes (` `) unter Windows

Hallo Forumer,

sorry an alle, die mir evtl. gestern geantwortet hatten, bevor es zu diesem Forums-Crash kam: Leider habe ich keine Eurer Antworten (if any) mehr lesen können. Bitte antwortet nochmal...

Also, mein 'Problemchen':

Zwecks Offline-Testen von CGI-Scripts auf meinen Win95B-Rechner habe ich mir gestern mal den Apache 1.3.9 heruntergeladen und installiert. Der Zugriff über localhost (127.0.0.1) funktioniert wunderbar. Als Perl-Interpreter benutze ich Active State Perl (Build 315 oder so). Der Aufruf von CGI-Programmen funktioniert im Prinzip ebenfalls.

Ein Perl-Script zum Durchsuchen der Website (Intermediate Search von Fluid Dynamics) enthält ein $ls = ls $file (ein entsprechendes ls.exe befindet sich in c:\bin, das natürlich im PATH enthalten ist). An dieser Stelle macht das Script Mist: Es geht ein Consolen-Fenster mit C:\COMMAND.COM auf, dann erfolgt ein Zugriff aufs Diskettenlaufwerk A: (wieso das???), die Console geht wieder zu und es passiert nichts, bzw. der Browser wartet auf Rückmeldung vom Script. Perl hängt sich an dieser Stelle auf, und Apache läßt sich auch nicht mehr herunterfahren, sondern es müssen die beiden Tasks 'Apache' und 'Perl' manuell beendet werden.

Kann sich das jemand erklären? Wer hat schon Perl-Scripts unter Apache unter Win95 zum Laufen gebracht, die per backquotes ( ) ein externes Betriebssystem-Kommando aufrufen? (Den Hinweis in der Perl-Doku, die COMSPEC-Variable in die Registry einzutragen, habe ich schon befolgt; wie man sich denken kann, ohne Erfolg...)

Gruß,
Stefan

  1. Kann sich das jemand erklären? Wer hat schon Perl-Scripts unter Apache unter Win95 zum Laufen gebracht, die per backquotes ( ) ein externes Betriebssystem-Kommando aufrufen?

    Unter Windows NT funktioniert das bei mir (ActivePerl 5005_02 build 509).

    Beispiel:

    Lebenszeichen aller gefundenen Server testen

    my $anzahl = 0;
    foreach my $server_name (maintain_fimshosts::makeList ())
            {
              # Zeile mitzählen und ausgeben
              $anzahl++;
              my $ausgabe = ping -n 3 $server\_name;
              $ausgabe = html::encode ($ausgabe);
              print " <TR VALIGN=TOP>\n";
              print "  <TD><SMALL><TT>",  $server_name,  "</TT></SMALL></TD>\n";
              print "  <TD><SMALL><PRE>", $ausgabe,     "</PRE></SMALL></TD>\n";
              print " </TR>\n";
            }

    Konkret "ls" würde ich mir aber notfalls selber schreiben (opendir, readdir, regular expressions).

    1. Konkret "ls" würde ich mir aber notfalls selber schreiben (opendir, readdir, regular expressions).

      Danke, habe es geändert und es funktioniert, auch wenn nicht sehr elegant und flexibel...:

      chdir($basedir);  
      opendir(DIR,".");  
      while($filename = readdir(DIR))  
      {  
      

      if($filename =~ /..?.htm.?/i)
        {
         push(@FILES,$filename);
        }
      }
      closedir(DIR);

      1. Danke, habe es geändert und es funktioniert, auch wenn nicht sehr elegant und flexibel...:

        »»  chdir($basedir);
        »»  opendir(DIR,".");
        »»  while($filename = readdir(DIR))
        »»  {

        if($filename =~ /..?.htm.?/i)
          {
           push(@FILES,$filename);
          }

        »»  }
        »»  closedir(DIR);

        Finde ich weder unelegant noch unflexibel. Du kannst Dir aussuchen, ob Du @FILES beispielsweise als nächstes sortieren willst etc.; Du kannst auch überlegen, ob Du den Inhalt des Verzeichnisses überhaupt statisch brauchst oder statt dessen auch gleich push() durch Deine Funktion zur Verarbeitung eines Eintrags ersetzen willst.

        Mein Sitemap-Generator macht genau das - höchstens noch verschärft dadurch, daß ich den Typ eines Verzeichniseintrags prüfe (Datei / Verzeichnis) und dann ggf. in die Rekursion springe.