Problème de table de caractères dans un fichier batch

  • Auteur de la discussion turlupin en ptard
  • Date de début

turlupin en ptard

Grand Maître
Bonjour - Bonsoir - Sans opinion
(rayer les mentions inutiles)

Voici ce que j'essaye de faire : créer une suite de répertoires portant un même nom suivi d'un numéro qui s'incrémente automatiquement.

Mon batch fonctionne correctement, à un détail près : un caractère ne s'affiche pas correctement, il s'agit du caractère ° qui est remplacé par une sorte de pavé.

Voici le batch en question :

@ECHO OFF
CLS


REM --------------------------------------------------------
REM Créer une série de dossiers numérotés
REM --------------------------------------------------------

CD D:\dossier
DIR

PAUSE

SET titre=référence_n°0

SET numero=001

:Label1

SET /a numero=%numero%+1

SET volume=%titre%%numero%

MD %volume%

CLS
DIR


IF NOT numero==100 GOTO Label1

:EOF

Si l'un de vous a une solution propre à proposer, je lui en serai très reconnaissant.
Non pas que ce soit un grave problème mais comme je me suis replongé dans le batch, ça m'agace un poil de me heurter à ces problèmes que j'ai oubliés depuis... ouh la, la ! Ça fait si longtemps, déjà ? Comme le temps passe !

Quand j'aurai la solution, je fignolerai pour qu'on puisse entrer les valeurs des variables initiales après lancement du batch... à moins que j'aie trop la flemme :D

Voilà, voilà... :) :hello:
 

VaderFR

Grand Maître
Bonjour,

pour faire les caractères spéciaux en batch, utilise l'éditeur EDIT sous DOS

valable pour le "é" tout autant que le reste.
 

KyrO_82

Grand Maître
Salut,

Tu peux changer le codage dans le fichier batch:

@ECHO OFF
CLS

chcp 1250

REM --------------------------------------------------------
REM Créer une série de dossiers numérotés
REM --------------------------------------------------------

...

Avec le fichier codé en ANSI, cela fonctionne.
Du moins en partie, à l'affichage dans la console les caractères ne s'affichent pas correctement, mais les dossiers créés ont le nom correct.

Pourquoi le code 1250? Aucune idée... mais ça fonctionne chez moi :)
 

turlupin en ptard

Grand Maître

Salut.
Oui, ça je sais mais pas d'EDIT dans Windows 7.
J'ai essayé une autre astuce avec Wordpad en choisissant "enregistrer sous" puis "autres formats" puis "document texte MSDOS" et ça ne marche pas.


Et ça marche aussi chez moi :bounce:

Viens là que je te fasse un gros bisou ! :D

Au cas où ça t'intéresserait j'ai utilisé un programme sympa : Powerbatch

Un de ses avantages est de permettre l'exécution pas à pas du batch en cours d'écriture. Il permet aussi de compiler les batch mais, pour ça comme pour d'autres choses, il faut qu'il soit installé ailleurs que dans le disque (ou la partition) système à cause des droits d'écriture limités.



L'adresse d'origine (avec quelques autres utilitaires)

http://astase.com/products/

Indiqué comme "compatible avec les Win 32 bits" il fonctionne parfaitement sous W7 64 bits... en tout cas pour le moment.
C'est un "vieux" programme donc il n'y a plus de support.

PS : La compilation en fichier .COM ne fonctionne pas en 64 bits. [:spamafote]
 

turlupin en ptard

Grand Maître
En fouinant un peu dans les menus de Powerbatch j'ai trouvé une commande qui convertit les caractères en mode DOS.
Tout ce remue-méninges alors que j'avais la solution sous la main... [:turlupin-en-ptard:4]

Je vais me cacher dans un trou bien profond.

D'autant plus qu'il y avait une erreur dans le batch, à la fin :
IF NOT numero==100 GOTO Label1
au lieu de
IF NOT %numero%==100 GOTO Label1

Il ne me reste qu'à remplacer les variables fixées dans le batch par des variables entrées comme paramètres au lancement du batch.

[:turlupin-en-ptard:1]
 

KyrO_82

Grand Maître

:cheese:

Bah moi et les batchs, on est pas spécialement amis... ça me semble un peu moyen-ageux, je préfère faire un petit script .NET ^^

C++:
Console.WriteLine("----------------------------------------")
Console.WriteLine("Créer une série de dossiers numérotés")
Console.WriteLine("----------------------------------------")

Dim Racine = "C:\Dossier\"
Dim Titre = "référence_n°0"

For i = 1 to 100
  Dim Dossier = Racine & Titre & i
  IO.Directory.CreateDirectory(Dossier)
  Console.WriteLine("Le dossier '" & Dossier & "' a été créé")
End For
Et ta fonction qui transforme les caractères, ça te donne des signes bizarres à mettre dans le script?


 

turlupin en ptard

Grand Maître

Voui mais je suis un vieux gâteux qui a appris le peu qu'il sait avant même l'apparition de MS DOS, le bat c'était déjà une révolution :D
Sans parler de BASIC, PASCAL, dBASE et quelques autres.
Et sinon, tu utilises un éditeur pour faire ça, non ?
Et après, comment tu utilises le fichier produit ?


Ça les remplace directement dans le texte.

Je me suis aperçu que j'avais encore une erreur dans mon batch :

MD %volume% doit en fait s'écrire MD "%volume%" sinon, sans les guillemets, les espaces contenus dans la variable sont interprétés comme des séparateurs et ça fout la m... dans la création des dossiers.
 

KyrO_82

Grand Maître

Ouais je comprend, et c'est tout à ton honneur :merci:


Ben en fait, "script" n'était pas très correct, il s'agit ici d'un code qui est (pré-)compilé pour faire un exe contenant du code qui est ensuite interprété par la machine virtuelle .NET (installé avec le framework .NET, installé d'office dans les Windows après XP)
Donc pour l'écrire, le plus simple est d'utiliser Visual Studio, dont la version "express" est totalement gratuite et complètement géniale à mon avis. (meilleur IDE que je connaisse, aide en temps réel lors de la frappe, débogage parfait...). Programmer en .NET est extrêmement simple grâce au gros framework complet et bien documenté.

Mais ça ne veut pas dire qu'on ne peut pas aussi faire des vrais scripts, interprétés à partir du texte en temps réel ligne par ligne, par exemple avec PowerShell (inclu dans les Windows aussi) et dans les différents produits Microsoft (Office).

Un autre avantage de .NET: on peut utiliser différent langages pour arriver à un même résultat: C#, C++, Visual Basic, J# (Java), Python, F# (OCaml, langage de programmation fonctionnel), ECMAScript (javascript), etc.

Après, bien sûr, il y a les désavantages: pour qu'une application fonctionne, il faut le framework (plusieurs 10aines de méga) et qui n'est officiellement supporté que sur Windows et XBox, même si des solutions existe pour Mac et Linux.
Et le plus gros: c'est Microsoft, c'est propriétaire, c'est pas gratuit: pour vendre une application .NET, il faut acheter la licence MSDN, et c'est pas donné...
 

zeb

Modérateur
Salut,

J'arrive après la bataille.
Évidemment, utiliser l'option de l'éditeur de fichiers ANSI<->OEM.

Quand on ne dispose de rien d'autre, on peut toujours faire ceci sous DOS :
[fixed]c:\> echo ° > petit_rond.txt[/fixed]

...puis ouvrir le fichier sous Windows.
 

turlupin en ptard

Grand Maître

Pas grave, tu es le bienvenu quand même :)


C'est juste que je venais à peine de découvrir le logiciel Powerbatch et que je n'avais pas encore découvert la fonction qui fait le boulot toute seule.
Maintenant c'est OK. Merci pour ta participation.

:)
 

zeb

Modérateur
Je me permettais de proposer une solution triviale pour ceux qui n'ont pas PowerBatch ou qui n'en ont pas encore découvert (RTFM) les fonctions les plus basiques. :o
 

turlupin en ptard

Grand Maître
Pour être exhaustif sur cette anecdote, il y a deux caractères qui sont graphiquement quasi identiques mais ont des codes différents et ont un usage différent.

L'un est le symbole "degré" (code Unicode 00B0, code ASCII alt+0176).

L'autre est l'indicateur ordinal masculin (code Unicode 00BA, code ASCII alt+0186) indiquant que ce qui suit va être un numéro d'ordre (c'est aussi bête que ça).

Leur conversion en DOS donne, très logiquement, 2 caractères différents, il faut donc choisir le bon au départ si on veut avoir le bon à l'arrivée.

Le premier est donc converti en ø en DOS et le second en §.

Cela dit, si on se trompe, ça ne se voit guère à l'affichage car voici ce que ça donne : ° au lieu de º

Il y a bien une différence quand on les affiche côte à côte, mais employer l'un à la place de l'autre ne pose pas de gros souci.

Voili, voilà, voilo... [:turlupin-en-ptard]
 

zeb

Modérateur
L'autre est l'indicateur ordinal masculin
pour les langues ibérico-romanes (portugais, espagnol et galicien) et pour l'italien. Il s'agit d'un "o" en exposant. Donc avant d'aller chercher les ordinaux étrangers, on peut évoquer le très français "n°", qui signifie numéro. (Qui osera me faire remarquer que c'est en fait de l'italien ?)

Quant au signe du degré, il s'agit d'un zéro, lui aussi en exposant.

Et pour information, le code pour Degré est 72550. :o

________________
/!\ Foutage-de-gueule-inside
 
Vous devez vous inscrire ou vous connecter pour répondre ici.
Derniers messages publiés
Statistiques globales
Discussions
730 132
Messages
6 718 008
Membres
1 586 388
Dernier membre
mery2005
Partager cette page
Haut