...donc j'en déduit que non.
par conséquent, je ne me casserais ps la tête pour gérer les caractères spéciaux.
Voici le code de la phase 1.
Tout d'abord, comme tout script batch, j'enlève l'affichage et j'initialise quelques variables
Code:
@echo off
set /A grandeur=1024
set /A size=0
set /A sizek=0
set /A sizem=0
set /A sizetempm=0
set /A sizetempg=0
set /A tropk=0
set /A troptk=0
set /A troptm=0
set /A sizet=0
set /A sizetm=0
set /A sizetg=0
set /A sizetk=0
set /A tfreek=0
set /A tfreem=0
set /A tfreeg=0
set /A tropfk=0
set /A tropfm=0
set /A phaseok=0
Parmi ces variables, les 2 principales, fournies au lancement..pour le moment.
Plus tard je ferais un script avec des demandes de saisie utilisateur, mais pour le développement ça va vachement plus vite de rappeler la même commande que d'avoir à taper à chaque fois nom de fichier playlist et destination.
Code:
rem %1 est le 1er paramètre fourni au script = fichier playlist à traiter
rem si %1 absent, nul ou vide, message erreur et stop OU set /P
rem si /P échoue... ?
set fichier=%1
rem %2 est le deuxième paramètre = destination
set destination=%2
echo /!\ =========================================================== /!\
echo Il ne doit pas y avoir de "&" dans un nom de fichier son !
echo /!\ =========================================================== /!\
ces variables sont déclarées dès le début afin de pouvoir les utiliser dans des fonctions différentes.
pas sûr que ce soit vraiment utile en batch, mais dans le doute ...
Ensuite, il faut lire le fichier.
Là, y'a 3 syntaxes possible pour la boucle
Code:
rem ===== BOUCLE 1 =====
rem for /f "delims=" %%a in (%fichier%) do (
rem ===== BOUCLE 2 =====
rem for /f "delims=" %%a in ('type %fichier%') do (
rem ===== BOUCLE 3 =====
rem for /f "delims=" %%a in ('type %fichier%)) do (
la boucle type 1 ne marche pas. la boucle 2 marche bien, je m'en contenterais donc...pour l'instant.
La fonction principale
Code:
for /f "delims=" %%a in ('type %fichier%') do (
call :traiter1 "%%a"
)
echo Taille totale requise : %sizetg% Go %sizetm% Mo %sizetk% Ko
rem on enleve les "
set destination=%destination:"=%
call:taillelibre "%destination%"
echo Espace disponible : %tfreeg% Go %tfreem% Mo %tfreek% Ko
if %tfreeg% GTR %sizetg% (
echo tout baigne !
set /A phaseok=1
) else (
if %tfreeg% == %sizetg% (
if %tfreem% GTR %sizetm% (
echo tout baigne !
set /A phaseok=1
) else (
if %tfreem% == %sizetm% (
if %tfreek% GTR %sizetk% (
echo tout baigne !
set /A phaseok=1
) else (
if %tfreek% == %sizetk% (
trop juste !
) else (
pas assez de place
)
)
) else (
echo pas assez de place
)
)
) else (
echo pas assez de place
)
)
goto:eof
On appelle la fonction de traitement n°1 de fichier afin de récupérer la taille de chaque fichier de musique listé, puis on appelle la fonction de recherche de la taille libre sur le périphérique destination.
1ère fonction, le traitement ligne par ligne, qui va appeler une sous-fonction pour récupérer la taille du fichier dont il est question sur la ligne traitée.
Code:
:traiter1
set ligne=%1
rem on enleve les "" fournis a l'appel
set ligne=%ligne:"=%
set /A size=0
set /A sizek=0
set /A sizem=0
set /A sizetempm=0
set /A sizetempg=0
set /A tropk=0
set /A troptk=0
set /A troptm=0
call:size_file "%ligne%"
rem la taille du fichier en Ko
set /A sizek=size/grandeur
if %sizek% GEQ %grandeur% (
set /A sizem=sizek/grandeur
)else (
set /A sizem=0
)
if %sizek% GEQ %grandeur% (
set /A tropk=sizem*grandeur
set /A sizek=sizek-tropk
)
set /A sizetm=sizetm+sizem
set /A sizetk=sizetk+sizek
if %sizetk% GEQ %grandeur% (
set /A sizetempm=sizetk/grandeur
)
if %sizetk% GEQ %grandeur% (
set /A troptk=sizetempm*grandeur
set /A sizetk=sizetk-troptk
set /A sizetm=sizetm+sizetempm
)
if %sizetm% GEQ %grandeur% (
set /A sizetempg=sizetm/grandeur
)
if %sizetm% GEQ %grandeur% (
set /A troptm=sizetempg*grandeur
set /A sizetm=sizetm-troptm
set /A sizetg=sizetg+sizetempg
)
goto :eof
et la sous-fonction appelée, qui récupère la taille du fichier listé sur une ligne de la playlist, en octets.
Code:
:size_file
set ligne=%1
rem on enleve les "" fournis a l'appel
set ligne=%ligne:"=%
set premiercar=%ligne:~0,1%
rem si ligne commence par # on ignore
if NOT "%premiercar%" == "#" (
set size=%~z1
) else (
set size=0
)
goto:eof
et maintenant la fonction de calcul de la taille libre sur la destination.
son résultat étant sur plusieurs lignes (taille libre, taille totale et taille libre disponible (?) en octets, une sous-fonction est appelée pour décortiquer tout ça.
Code:
:taillelibre
set cible=%1
set /A tfree=0
set /A tfreek=0
set /A tfreem=0
set /A tfreeg=0
for /f "delims=" %%A in ('fsutil volume diskfree %cible%') do (
call:calcultaillelibre "%%A"
set /A tfree=tfree+tfreek
)
set /A tfreek=tfree
if %tfreek% GEQ %grandeur% (
set /A tfreem=tfreek/grandeur
) else (
set tfreem=0
)
if %tfreek% GEQ %grandeur% (
set /A tropfk=tfreem*grandeur
set /A tfreek=tfreek-tropfk
)
if %tfreem% GEQ %grandeur% (
set /A tfreeg=tfreem/grandeur
) else (
set tfreeg=0
)
if %tfreem% GEQ %grandeur% (
set /A tropfm=tfreeg*grandeur
set /A tfreem=tfreem-tropfm
)
goto:eof
les blocs "if" successifs sont dus à une incrémentation tardive des variables.
la sous fonction qui décortique le résultat sur plusieurs lignes, en octets, pour renvoyer un résultat dans 3 variables, en Ko, Mo, Go.
Code:
:calcultaillelibre
set lignel=%1
set diskfree=%lignel%
rem on enleve les "" fournis a l'appel
set lignel=%lignel:"=%
set diskfree=%diskfree:"=%
rem taille libre en Ko
set diskfree=%diskfree:~43,-3%
set /A tfreek=%diskfree%
if NOT "%lignel:libres=%" == "%lignel%" (
if "%lignel:disponibles=%" == "%lignel%" (
) else (
set /A tfreek=0
)
) else (
set /A tfreek=0
)
goto:eof
je me met à la phase 2, à savoir trouver la plus petite racine commune aux fichiers, pour ensuite la recréer sur la destination (avec un xcopy par exemple).
j'ai déjà l'algorithme en tête, restera plus que la syntaxe, à la llimite.