recuperer un nom de fichier sans extension dans un for

recuperer un nom de fichier sans extension dans un for - Shell/Batch - Programmation

Marsh Posté le 17-03-2006 à 21:12:10    

Je viens d'ecumer tout ce forum et j'ai pqs trouvé de réponse, alors voilà ma question
 
j'ai recuperé un ipod et j'ai un stock de wav sur mon ordi
pour eviter la conversion "a la mano" avec itunes, j'utilise iTunesEncode, qui encode en AAC en ligne de commande
les parametres à passer sont fichier_entree.wav fichier_sortie.m4a
J'utilise des variables pour stocker l'extension de fichier m4a
 
mon script va chercher dans un répertoire qui contient des albums en wave, WAVPath, et pour chaque album appelle ensuite l'encodeur pour chaque titre, qui vont etre écrits dans le répertoire iTunes selon la meme arborescence de répertoire AACPath (le nom de l'album).
iTunesEncode se trouve lui dans CodecPath
 
mon probleme c'est que je crée une variable temp pour chaque album et pour chaque titre (AACTempPath et AACFile), qui sont perpetuellement vides.
Comprend pas où est mon erreur  
 
Si qqun a une idée, merci  
 
set WAVPath=O:\
set AACPath=I:\
set CodecPath=W:\
 
set AACExt=.m4a
Set AACTempPath=
 
for /f "delims=" %%b in ('dir "%WAVPath%" /b') do (
 
     set AACTempPath=%%AACPath%%%b%                         / Définit l'album dans le dossier iTunes
     md AACTempPath                                                       / Crée le dossier album dans le dossier iTUnes
 
     for /f "delims=" %%a in ('dir "%AACTempPath" /b') do (
 
       set AACFile=%~na%AACExt%                                    / Définit la chanson moins l'extension wav
       CodecPath\iTunesEncode.exe -e "AAC Encoder" -i %%a -o %AACFile% /Appelle l'encodeur en passant en parametre de sortie fichier_sortie.m4a
    )
)  
 
pause

Reply

Marsh Posté le 17-03-2006 à 21:12:10   

Reply

Marsh Posté le 17-03-2006 à 22:59:04    

Tu ne sais pas utiliser la commande  
set  
et la boucle  
for  
 
set /?  
et lis l'aide, notamment le paragraphe concernant l'expansion retardée de variables d'environement.  
 
La méthode la plus simple, dans ton cas, serait d'utiliser directement des valeurs %%b et %%a au lieu d'initialiser des variables supplémentaires.

Reply

Marsh Posté le 18-03-2006 à 14:03:04    

Merci nglechau pour ta réponse...
 

wackevat a écrit :

Tu ne sais pas utiliser la commande  
set  
et la boucle  
for  


 
Ca je sais, c'est pour cela que je poste. Generalement, je code avec des langages moins triviaux :P
 

wackevat a écrit :


 
set /?  
et lis l'aide, notamment le paragraphe concernant l'expansion retardée de variables d'environement.  
 
La méthode la plus simple, dans ton cas, serait d'utiliser directement des valeurs %%b et %%a au lieu d'initialiser des variables supplémentaires.


 
J'ai essayé de le faire, mais le fait d'insérer un \ dans mon code de sortie path\nom_de_fichier.extension de fichier renvoie :
ex : %AACPath%%%b%\%~na%AACExt%
 
I:\mon_album~na.m4a
 
au lieu de renvoyer :
I:\mon_album\montitre.m4a
 
J'ai donc suivi ton conseil et appelle maintenant CMD /V:ON pour l'expansion retardée des variables d'environnement.
Mon code est donc  
set AACTempPath=!ACPath! %%b
mais rien n'y fait, ma variable est toujours vide
 
Je sèche...


Message édité par julienbret le 18-03-2006 à 14:04:55
Reply

Marsh Posté le 18-03-2006 à 14:47:17    

Bon, quand je disais que tu ne savais pas utiliser la commande
set
ceci comprenait également l'usage des signes %, et là tu n'as toujours pas pigé ;) Ils sont interprétés dans l'ordre, de gauche à droit.
 
Donc déjà cette ligne est fausse :

Code :
  1. set AACTempPath=%%AACPath%%%b%


et celle-ci aussi :

Code :
  1. %AACPath%%%b%\%~na%AACExt%


 
La syntaxe de
set
est
set [option] variable=[valeur]
 
VAR est une variable
%VAR%, %a, %%a sont des valeurs.
 
%a à la ligne de commandes et %%a dans un script.
 
Alors le bon code (en dehors du contexte, ici = boucle for) est :

Code :
  1. set AACTempPath=%AACPath%%%b


 
Je te laisse corriger la deuxième affectation.
 
Après, pour  l'expansion retardée des variables d'environnement, pour éviter d'évoquer cmd avec les options appropriées, tu peux appeler la commande
setlocal
avec la bonne option, au début du script.
 
Réctifie déjà tout ça et poste ta nouvelle version, avec ou sans  l'expansion retardée des variables d'environnement, c'est comme tu préfères.


Message édité par wackevat le 18-03-2006 à 14:49:38
Reply

Marsh Posté le 20-03-2006 à 11:00:48    

salut nglechau,
 
merci pour les conseils et le temps passé à me répondre mais là ça commence à bien faire ce langage de  :fou:  
s'il faut passer par des artifices "d'expansion retardée de variables", tout ça pour faire une bete affectation... même un pointeur c'est + simple
 
donc ok pour ma ligne fausse, j'avais vu... erreur de frappe  :pt1cable:  
mais avec tous les CMD /e:on, CMD/v:on, setlocal et modif de <delayedExpansion> dans <command processor> de ma table de registre,
 
set AACTempPath=!AACTempPath! %AACPath%%%b  
donne nada
 
de toutes façons, même en virant les variables temp de boucle, le résultat auquel je veux arriver ne marche pas, car le fait d'introduire un "\" dans l'affactation sur le format ~na%Variable "tue" le formatage de la variable de sortie !  
 
Pense que je vais faire un bon vieux truc en langage compilé  :D  
 
 

Reply

Marsh Posté le 20-03-2006 à 15:00:25    

julienbret a écrit :

de toutes façons, même en virant les variables temp de boucle, le résultat auquel je veux arriver ne marche pas, car le fait d'introduire un "\" dans l'affactation sur le format ~na%Variable "tue" le formatage de la variable de sortie !


Si tu n'es pas à l'aise avec les options d'environnement, opte pour celles par défaut :D
 
Par contre, tu n'avais toujours pas compris qu'il fallait utiliser
%%a
au lieu de
%a dans un batch. Donc :
%%~na
et non pas
%~na.
 
Et je ne comprends pas ce que tu veux présenter par
~na%Variable
encore une faute de frappe ? ;)
 

Reply

Marsh Posté le 21-03-2006 à 10:55:43    

wackevat a écrit :

Si tu n'es pas à l'aise avec les options d'environnement, opte pour celles par défaut :D
 
Par contre, tu n'avais toujours pas compris qu'il fallait utiliser
%%a
au lieu de
%a dans un batch. Donc :
%%~na
et non pas
%~na.
 
Et je ne comprends pas ce que tu veux présenter par
~na%Variable
encore une faute de frappe ? ;)


 
Quand tu dis dans un batch, tu veux dire dans une boucle ?
C'est quand même chelou votre langage  :)  
Vive le $ !
 
M'enfin bon, celui qui n'essaie pas est un ....
Donc suivant tes conseils, j'ai viré les variables temporaires, et j'arrive à un truc comme ça, qui marche ! Enfin ! Merci  :wahoo:  
 
      %CodecPath%iTunesEncode.exe -e "AAC Encoder" -i %PathAudio%%%b\%%a -o %PathEncode%%%b\%%~na%AACExt%
 
Alors continuant avec ces  :fou: de variables/paramètres, je veux utiliser un applicatif externe avant mon encodage pour mettre à niveau tous mes waves.
J'ai donc Besweet que j'appelle comme ca
BeSweet.exe -core( -input "repertoire_entree\fichier" -output "répertoire_sortie\fichier"  -2ch ) -azid( -s stereo -g 0.80 )
pour ceux que ca interesse le param -azid normalise mes fichiers a 80%
 
donc %ENCPath%Besweet.exe -core( -input %PathAudio%%%b\%%a -output %NormalizePath%%%b\%%a ) -azid( -s stereo -g 0.80 )
 
avec %%b le répertoire "mon_album" et %%a le fichier "mon_titre"
 
Ben pareil, ça marche po.  
Encore un truc de sorcier ?
 
 
 

Reply

Marsh Posté le 21-03-2006 à 11:56:25    

julienbret a écrit :

Quand tu dis dans un batch, tu veux dire dans une boucle ?


Nop ;) c'est-à-dire que tu écris les commandes dans un fichier puis lancer ce dernier au lieu de les exécuter directement à l'invite de commandes.
 
Pour le deuxième souci, il n'y a pas d'espace dans ton chemin ? Poste le script proprement pour voir. Tu peux aussi placer un
echo
avant la commande et une
pause
à la fin du batch, éventuellement commenter
@echo off
au début, pour vérifier si les variables sont correctement initialisées et afficher les messages d'erreur.

Reply

Marsh Posté le 21-03-2006 à 13:41:18    

wackevat a écrit :

Nop ;) c'est-à-dire que tu écris les commandes dans un fichier puis lancer ce dernier au lieu de les exécuter directement à l'invite de commandes.
 
Pour le deuxième souci, il n'y a pas d'espace dans ton chemin ? Poste le script proprement pour voir. Tu peux aussi placer un
echo
avant la commande et une
pause
à la fin du batch, éventuellement commenter
@echo off
au début, pour vérifier si les variables sont correctement initialisées et afficher les messages d'erreur.


 
merci pour les trucs de dev... ça je sais faire  :p  
 
ce que je ne comprends pas, c'est que cette commande
%ENCPath%BeSweet.exe -core( -input "%ENCPath%%inFile%" -output "%CNVPath%%outFile%"  -2ch ) %ENCParam%
marche à l'extérieur d'une boucle, et à l'intérieur, même echo de cette ligne plante !
 
Par contre, dans la boucle, un echo de la première partie
echo %ENCPath%BeSweet.exe -core( -input "%ENCPath%%inFile%" -output "%CNVPath%%outFile%"  -2ch )  
marche et renvoie :
 
W:\TEST_AAC\BeSweet.exe -core( -input "W:\TEST_AAC\infile.wav" -output "W:\
TEST_AAC\CONVERT\outfile.wav"  -2ch
MAIS SANS LA PARENTHESE FERMANTE
 
pareil pour les paramètres passés en variable :
echo %ENCParam%
marche et renvoie  
-azid( -s stereo -g 0.80
MAIS SANS LA PARENTHESE FERMANTE
 
C'est un probleme avec les caractères speciaux ?


Message édité par julienbret le 21-03-2006 à 13:46:23
Reply

Marsh Posté le 21-03-2006 à 13:53:59    

Essaie le caractère d'échappement, c'est-à-dire :
^)
 
Sans quoi cette parenthèse fermante est interprétée comme celle de la boucle for.

Reply

Marsh Posté le 21-03-2006 à 13:53:59   

Reply

Marsh Posté le 21-03-2006 à 14:26:20    

wackevat a écrit :

Essaie le caractère d'échappement, c'est-à-dire :
^)
 
Sans quoi cette parenthèse fermante est interprétée comme celle de la boucle for.


 
MERCI m'sieur !!
J'ai oublié : pas de fin de ligne avec des ;  :lol:  
Eh bien, une bonne moulinette à venir et un ipod à remplir
 

Reply

Marsh Posté le 21-03-2006 à 14:37:08    

julienbret a écrit :

MERCI m'sieur !!
J'ai oublié : pas de fin de ligne avec des ;  :lol:


Pas compris :P
 
Et ce serait bien que tu ne m'appelles pas m'sieur ;)

Reply

Marsh Posté le 21-03-2006 à 15:09:12    

wackevat a écrit :

Pas compris :P
 
Et ce serait bien que tu ne m'appelles pas m'sieur ;)


 
Dans les langages "normaux", on aime bien mettre des ; à la fin des lignes
Comme ça l'interpreteur il sait où il va quand il trouve des )  :)  
Voila Mdame
 
Encore merci
 :jap:  

Reply

Marsh Posté le 21-03-2006 à 15:13:14    

julienbret a écrit :

Dans les langages "normaux", on aime bien mettre des ; à la fin des lignes


Ah oki, je n'avais pas fait le lien :P

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed