exec() ok avecc cmd mais marche pas en php

Makina
Invité n'ayant pas de compte PHPfrance

24 mai 2006, 12:24

Bonjour,

Je fait un script qui affiche des mises à jour à l'aide de la commande wmic.
	        $file="\"C:\Program Files\EasyPHP1-8\www\MAJ\HistoriqueUpdate\proc\\$nom.html\"";
	$file2="C:\Program Files\EasyPHP1-8\www\MAJ\HistoriqueUpdate\proc\\$nom.html";
	$req = "wmic /node :$nom qfe list brief /format:htable> $file";
	exec($req);
	echo $req,'<br>';
	if (filesize($file2) <= '277')
		unlink($file2);
	else
		echo "<a href='../MAJ/HistoriqueUpdate/Proc/$nom.html' TARGET='_blank'>$file</a><br>";
	}
Je doit avoir un fichier html, portant le nom de la machine.
Cela marche masi mon fichier html est vide. D'ou la presence du
if (filesize($file2) <= '277')
		unlink($file2);
si mon fichier html est vide, je le supprime.

Le plus etonnant est que si je copie la requete ($req) dans l'invite de commande MS-DOS cela marche parfaitement :shock:

J'ai essayé en mettant un sleep(5) entre chaque execution de requete mais rien a y faire...

Merci pour vos solutions et idées potentiels

ViPHP
fab
ViPHP | 2657 Messages

24 mai 2006, 12:54

le code est hébergé ou ? chez toi ?
Seul l'intelligent a le pouvoir de se trouver con
try { work(); } catch(FlemmeExeption $e) { sleep(84600); }

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

24 mai 2006, 12:59

Quand tu utilise un anti-slash (\) dans une chaine de caractères il faut l'échapper (le précéder) par un autre anti-slash car il s'agit d'un mot-clé du langage PHP. exactement comme tu as échappé le " interne dans la chaine $file.
Corrigé et simplification:
    $file="C:\\Program Files\\EasyPHP1-8\\www\\MAJ\HistoriqueUpdate\\proc\\$nom.html"; 
    
    $req = "wmic /node :$nom qfe list brief /format:htable> \"$file\""; 
    if (exec($req)){ 
        echo $req,'<br>'; 
        if (filesize($file) <= 0) 
            unlink($file); 
        else 
            echo "<a href='../MAJ/HistoriqueUpdate/Proc/$nom.html' TARGET='_blank'>$file</a><br>"; 
     }
si exec ne fonctionne pas pour des raisons d'insuffisance du droit d'exécution utiliser popen ($req, "r") qui crée un procéssus d'éxécution séparé.
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène

Makina
Invité n'ayant pas de compte PHPfrance

24 mai 2006, 14:18

Re

Le code est hebergé chez moi, j'ai essayer ta methode sadeq, avec ou sans le popen($req,"r") et ca ne marche pas.

J'ai toujours le même problème... le fichier est vide, quand je fais le
echo $req,'<br>';
je fais un copier collé, je le transmet a l'invite de commande ms dos et ca marche...

Idem avec le popen() !

Sachant que le script est dans une boucle, si la commande ne marche pas pour un $nom donné, il est possible que ce soit ca à l'origine du bug ?

Merci

Makina
Invité n'ayant pas de compte PHPfrance

24 mai 2006, 14:25

Re

Je retire ce que j'ai dit, le problême ne vient pas de la boucle.

J'ai declaré $nom avec le nom du serveur ou la commande fonctionnait dans l'invite de commande ms-dos.
<?php
set_time_limit(50);
echo "<H2> Historique des mises à jour windows</H2>";
$nom = 'Mail';
$file= "C:\\Program Files\\EasyPHP1-8\\www\\MAJ\HistoriqueUpdate\\$nom.html";
$req = "wmic /node :$nom qfe list brief /format:htable > \"$file\"";
echo $req,'<br>';
echo "<a href='../MAJ/HistoriqueUpdate/$nom.html' TARGET='_blank'>$nom</a><br>";
?>
Voila mon code en entier.

Code : Tout sélectionner

wmic /node :Criollo qfe list brief /format:htable > "C:\Program Files\EasyPHP1-8\www\MAJ\HistoriqueUpdate\Criollo.html"
Voila la commande que j'obtien a l'ecran.

Cette commande marche bien quand je l'execute sous ms dos.

Merci

Makina
Invité n'ayant pas de compte PHPfrance

24 mai 2006, 15:21

C'est bon, j'ai trouve non pas la solution mais une solution.
En effet j'ai copier les commandes dans un fichier .bat, que j'execute avec le exec().

Voili voilou, merci pour tout.
:wink: