Page 1 sur 2

Batch de move récursif

Posté : 10 août 2011, 16:26
par Megadeth
Bonjour,

Voici un petit script permettant de créer un fichier .bat permettant de déplacer tous les répertoires et sous-répertoires d'un dossier vers une destination donnée.
<?php 

//peut servir pour compléter chaque ligne du batch
$path='';

//fonction principale
function scan($repertoire) {
	$monrepertoire = opendir($repertoire) or die("Erreur de listage : le répertoire n'existe pas"); 
		
		while($element = @readdir($monrepertoire)) {
			
			//on teste si l'élément est bien un répertoire
			if(is_dir($repertoire.'/'.$element) && $element != '.' && $element != '..') {				

				//on peaufine la ligne du batch en chuintant, remplacant...
				$modifs = substr($repertoire.'\\'.$element,2,4000);
				
				//on écrit la ligne de commande qui sera sauvegardée
				$final = 'move '.$modifs.'\*.* dossier de destination';	
			
				//on crée et incrémete le fichier copie.bat
				$bat = fopen("copie.bat", "a+"); 
				fwrite($bat, $final."\n");   
				fclose($bat);
				
				//récursivité pour avoir autant de lignes de commande que de dossiers
				scan($repertoire.'\\'.$element);
			}
	
	}
	
	closedir($monrepertoire);
}

//appel initial
scan('.');

if(file_exists('copie.bat')){
echo 'fichier .bat généré';	
}
?>
Théorie -> Albat (encore merci !)
Développement -> Mega

Si vous voyez un truc qui cloche, n'hésitez pas :)

Mega
;)

Re: Batch de move récursif

Posté : 10 août 2011, 17:16
par Megadeth
P'tites modifs
<?php 

//peut servir pour compléter chaque ligne du batch
$path='';

//fonction principale
function scan($repertoire) {
	$monrepertoire = opendir($repertoire) or die("Erreur de listage : le répertoire n'existe pas"); 
		
		while($element = @readdir($monrepertoire)) {
			
			//on teste si l'élément est bien un répertoire
			if(is_dir($repertoire.'/'.$element) && $element != '.' && $element != '..') {				

				//on peaufine la ligne du batch en chuintant, remplacant...
				$modifs = substr($repertoire.'\\'.$element,2,4000);
				
				//on écrit la ligne de commande qui sera sauvegardée
				$final = 'move '.$modifs.' B';//B étant mon dossier de destination	
			
				//on crée et incrémete le fichier copie.bat
				$bat = fopen("copie.bat", "a+"); 
				fwrite($bat, $final."\n");   
				fclose($bat);
				
				//récursivité pour avoir autant de lignes de commande que de dossiers
				scan($repertoire.'\\'.$element);
			}
	
	}
	
	closedir($monrepertoire);
}

//appel initial
scan('.');

if(file_exists('copie.bat')){
echo 'fichier .bat généré';	
}
?>
Je pense qu'il reste une chose à faire, mettre tout dans un tableau et alimenter le fichier en faisant un tri inverse à moins qu'on puisse trier le fichier txt ou lancer le .bat depuis la fin, c'est possible ou array solution ?

Re: Batch de move récursif

Posté : 10 août 2011, 17:48
par Cyrano
Salut,
je n'ai pas regardé pour la question que tu as posé, en revanche, je vais faire mon difficile :P

C'est quoi cette indentation de barbare et ces lignes vides un peu anarchiques ? ? Tant qu'à citer Albat, je vais assumer pleinement le fait qu'il m'ait un jour, il y a fort longtemps, qualifié de « méticuleur de mouches » Et nous sommes sur un forum public souvent parcouru par des développeurs de tous niveaux, incluant pas mal de débutants. Donc il me semble qu'on a le devoir de leur montrer l'exemple en écrivant proprement nos lignes de codes. Je reprends donc ton code avec une remise en forme et une seule toute petite modification en mode strict :)
<?php
/**
 * peut servir pour compléter chaque ligne du batch
 */
$path='';

/**
 * fonction principale
 *
 * @param   String  $repertoire
 */
function scan($repertoire)
{
    $monrepertoire = opendir($repertoire) or die("Erreur de listage : le répertoire n'existe pas");
    while(false !== ($element = readdir($monrepertoire)))
    {
        //on teste si l'élément est bien un répertoire
        if(is_dir($repertoire.'/'.$element) && $element != '.' && $element != '..')
        {
            //on peaufine la ligne du batch en chuintant, remplacant...
            $modifs = substr($repertoire.'\\'.$element,2,4000);

            //on écrit la ligne de commande qui sera sauvegardée
            $final = 'move '.$modifs.' B';//B étant mon dossier de destination

            //on crée et incrémete le fichier copie.bat
            $bat = fopen("copie.bat", "a+");
            fwrite($bat, $final."\n");
            fclose($bat);

            //récursivité pour avoir autant de lignes de commande que de dossiers
            scan($repertoire.'\\'.$element);
        }
    }
    closedir($monrepertoire);
}

/**
 * appel initial
 */
scan('.');

if(file_exists('copie.bat'))
{
    echo 'fichier .bat généré';
}
?>
Me semble que de cette manière, j'ai moins de mal à le lire :)

My 2¢ :langue:

Re: Batch de move récursif

Posté : 10 août 2011, 19:57
par albat
Z'avez vu ? Y a une mouche qui vient de passer, en se frottant les fesses... :lol:

Re: Batch de move récursif

Posté : 11 août 2011, 00:37
par Cyrano
Z'avez vu ? Y a une mouche qui vient de passer, en se frottant les fesses... :lol:
Je te laisse imaginer ce que ça pourrait être si je devenais un jour « méticuleur de coccinelles » :-*

Enfin bon, je dis ça hein... :langue:

Re: Batch de move récursif

Posté : 11 août 2011, 00:59
par Megadeth
<MODE POURRI ON>
C'est pas moi c'est Albat qui m'a braqué un pistolet sur la tempe et qui m'a forcé à coder comme ça, j'étais pas d'accord !!!!!!!!!!!!!!!!!! (y a assez de ! On y croit là ?)
<MODE POURRI OFF>

<MODE ILLUMINE ON>
Ouep c'est une vieille indentation ancestrale qui me vient des mayas mais vous pouvez pas comprendre, moi même déjà c'est dur alors des pisseurs de lignes...
<MODE ILLUMINE OFF>

<MODE HUMBLE ON>
MERCI pour la claque derrière la tête, ça fait du bien de temps en temps et je suis pas que MASO, à bon entendeur :)
<MODE HUMBLE OFF>

Bah là je vais aller me pieuter mais je posterai la version finale via l'array depuis le code de sieur de bergerac.

Bonne nuit !
:sleeping:

Re: Batch de move récursif

Posté : 11 août 2011, 01:03
par Cyrano
<MODE ILLUMINE ON>
Ouep c'est une vieille indentation ancestrale qui me vient des mayas mais vous pouvez pas comprendre, moi même déjà c'est dur alors des pisseurs de lignes...
<MODE ILLUMINE OFF>
Celle-là j'y crois déjà davantage, d'ailleurs, en fréquentant Albat qui m'a déjà narré quelques souvenirs de codage en Lisp, pouvait-il en être autrement... :langue:

Re: Batch de move récursif

Posté : 12 août 2011, 10:14
par Megadeth
Bonjour,

Quelqu'un peut-il me dire pourquoi mon array est vide ?
<?php
/**
 * peut servir pour compléter chaque ligne du batch
 */
$path='';
$arr = array();
/**
 * fonction principale
 *
 * @param   String  $repertoire
 */
function scan($repertoire)
{
    $monrepertoire = opendir($repertoire) or die("Erreur de listage : le répertoire n'existe pas");
    while(false !== ($element = readdir($monrepertoire)))
    {
        //on teste si l'élément est bien un répertoire
        if(is_dir($repertoire.'/'.$element) && $element != '.' && $element != '..')
        {
            //on peaufine la ligne du batch en chuintant, remplacant...
            $modifs = substr($repertoire.'\\'.$element,2,4000);

            //on écrit la ligne de commande qui sera sauvegardée
            $final = 'move '.$modifs.' B';//B étant mon dossier de destination

			$arr[]=$final;
            
            //récursivité pour avoir autant de lignes de commande que de dossiers
            scan($repertoire.'\\'.$element);
        }
    }
    closedir($monrepertoire);
}

/**
 * appel initial
 */
scan('.');

if(file_exists('copie.bat'))
{
    echo 'fichier .bat généré';
}

echo '<pre>';
print_r($arr);
echo '</pre>';

/*on crée et incrémete le fichier copie.bat
$bat = fopen("copie.txt", "a+");
fwrite($bat, $final."\n");
fclose($bat);*/
?>
alors que si je fais dans un fichier à part
<?php 
$arr = array();

//on écrit la ligne de commande qui sera sauvegardée
$final = 'move dos3\*.* dossier de destination';	

$arr[]=$final;

echo '<pre>';
print_r($arr);
echo '</pre>';

?>
Ca fonctionne #-o

Mega
;)

Re: Batch de move récursif

Posté : 12 août 2011, 10:19
par Cyrano
Indice : portée des variables non globales... :-k

Pour que ton truc fonctionne, il manque un paramètre à ta fonction scan() et du coup un retour aussi.

Re: Batch de move récursif

Posté : 12 août 2011, 10:59
par Megadeth
Bonjour et merci Cyrano,

Ok j'ai mis $arr en argument de cette façon.
$arr = array(); 

function scan($repertoire,$arr)
{
    $arr[]=$final;
}

scan('.',$arr);
mais rien n'y fait :?

On peut p'tet pas passer un array de cette façon...

Mega
;)

Re: Batch de move récursif

Posté : 12 août 2011, 11:30
par Cyrano
Et le retour ?

La portée d'une variable :lorsqu'elle est définie à l'extérieur d'une fonction, elle n'est pas « visible » depuis l'intérieur d'une fonction donc en la mettant en paramètre dans l'appel, on peut la rendre accesible et modifiable.
L'inverse est tout aussi vrai, et donc pour la voir depuis l'extérieur, il faut que la fonction la retourne.

CQFD... :-*

Re: Batch de move récursif

Posté : 12 août 2011, 14:39
par Megadeth
C'est pas ce que j'ai fait ?

Excuse moi, là, je sèche :(

Mega
;)

Re: Batch de move récursif

Posté : 12 août 2011, 14:54
par Megadeth
Ah je crois que tu fais référence à l'appel récursif du scan donc j'ai fait ceci :
//récursivité pour avoir autant de lignes de commande que de dossiers
scan($repertoire.'\\'.$element,$arr);
Je n'ai plus le message d'erreur mais mon tableau est toujours vide :?

C'est mieux avec
global $arr;
$arr[]=$final;
:D

Re: Batch de move récursif

Posté : 14 août 2011, 21:40
par stealth35
a quoi ça sert a part de faire la même chose que rename mais en moins bien et plus compliqué ?

Re: Batch de move récursif

Posté : 15 août 2011, 17:05
par Megadeth
Salut,

Je ne te suis pas...

Mega
;)