Utilisation de FINDSTR dans un fichier de commandes (batch)
Répondre à la discussion
Affichage des résultats 1 à 11 sur 11

Utilisation de FINDSTR dans un fichier de commandes (batch)



  1. #1
    KCRATSA

    Utilisation de FINDSTR dans un fichier de commandes (batch)


    ------

    Bonjour, ou bonsoir selon l'heure à laquelle vous lirez ces lignes.

    Je voudrais réaliser un fichier batch pour sauvegarder le contenu d'un dossier sur un disque USB avec ROBOCOPY (je ne maîtrise pas du tout Power Shell).
    Dans ce fichier batch, je veux récupérer le numéro d'identification du disque USB pour m'assurer que la sauvegarde s'effectue bien sur le bon disque.
    Pour cela j'utilise la commande VOL qui me retourne un résultat sur 2 lignes, par exemple, si M: correspond à mon disque USB de sauvegarde :

    ----------------
    D:\Test>VOL M:
    Le volume dans le lecteur M s’appelle Maître
    Le numéro de série du volume est 1CC3-54C7
    ----------------

    Je veux donc récupérer le numéro de série du disque dans une variable i et vérifier ainsi qu'il s'agit bien du bon disque.
    J'utilise pour cela la commande FINDSTR, en ligne de commande directe la syntaxe est la suivante, dans cette exemple j'affiche la valeur trouvée :

    ---------------
    D:\Test>for /f "tokens=8 delims= " %i in ('vol m: ^| findstr /i /c:"Le numéro de série du volume"') do @echo %i
    1CC3-54C7
    ---------------

    Si j'utilise cette commande dans le fichier batch TEST.BAT, après avoir changé %i en %%i

    Contenu du fichier TEST.BAT:
    ----------------
    for /f "tokens=8 delims= " %%i in ('vol m: ^| findstr /i /c:"Le numéro de série du volume"') do @echo %%i

    @REM - Pour éviter la fermeture de la fenêtre
    pause
    ----------------

    En lançant TEST.BAT, j'obtiens :

    ----------------
    D:\Test>for /F "tokens=8 delims= " %i in ('vol m: | findstr /i /c:"Le numéro de série du volume"') do @echo %i

    D:\Test>pause
    Appuyez sur une touche pour continuer...
    ----------------

    Mais le numéro de série n'est pas affiché.

    Par contre, en ne gardant que "rie du volume" pour ne pas mettre de caractères accentués, en lançant TEST.BAT, j'obtiens bien le résultat escompté :

    ----------------
    D:\Test>for /F "tokens=8 delims= " %i in ('vol m: | findstr /i /c:"rie du volume"') do @echo %i
    1CC3-54C7

    D:\Test>pause
    Appuyez sur une touche pour continuer...
    ----------------

    C'est la même chose si j'envoie le résultat de VOL M: dans un fichier texte intermédiaire et que je filtre avec FINDSTR.


    A part un traitement différencié des caractères accentués que je ne sais pas résoudre, je n'arrive pas à trouver d'autres explications de ce comportement, quelqu'un a-t-il une idée ?

    -----

  2. #2
    umfred

    Re : Utilisation de FINDSTR dans un fichier de commandes (batch)

    le jeu de caractère de la console vs celui de ton fichier batch. vérifie quel encodage tu as pour ton fichier (ANSI ou UTF8)
    tu peux aussi changer dans le batch en ajoutant au début
    chcp 1252
    et à la fin avant la sortie
    chcp 850
    àa change le jeu de code de caractères

  3. #3
    KCRATSA

    Re : Utilisation de FINDSTR dans un fichier de commandes (batch)

    Merci pour la réponse.

    J'ai effectivement cherché dans ce sens là mais pour modifier TEST.BAT j'utilise notepad.exe qui me propose seulement les codages suivants :
    ANSI
    UTF-16 LE
    UTF-16 BE
    UTF-8
    UTF-8 avec marque d'ordre d'octet

    Quel lien avec les code de page utilisés avec CHCP : 1252, 850, etc.

    J'avais d'ailleurs effectivement utilisé CHCP 1252 (et autres valeurs) en début de batch mais sans succès.

  4. #4
    umfred

    Re : Utilisation de FINDSTR dans un fichier de commandes (batch)

    fichier en ANSI + chcp 1252, ça fonctionne

  5. A voir en vidéo sur Futura
  6. #5
    KCRATSA

    Re : Utilisation de FINDSTR dans un fichier de commandes (batch)

    Merci encore pour la réponse, mais hélas ça ne marche pas.

    J'ai ouvert NOTEPAD.EXE, j'y ai écrit ces lignes (entre les -------------) :

    -----------------
    chcp 1252

    for /F "tokens=8 delims= " %%i in ('vol m: ^| findstr /i /c:"Le numéro de série du volume"') do @echo %%i

    pause
    -----------------

    J'ai enregistré en sélectionnant le codage ANSI et en nommant le fichier T1.BAT

    Lorsque j'exécute T1.BAT j'obtiens (entre les -------------) :

    -----------------
    C:\Test>chcp 1252
    Page de codes active*: 1252

    C:\Test>for /F "tokens=8 delims= " %i in ('vol m: | findstr /i /c:"Le numéro de série du volume"') do @echo %i

    C:\Test>pause
    Appuyez sur une touche pour continuer...
    -----------------

    Par contre en lançant la commande suivante dans une fenêtre de commande (entre les -------------) :

    -----------------
    C:\Test>for /F "tokens=8 delims= " %i in ('vol m: ^| findstr /i /c:"Le numéro de série du volume"') do @echo %i
    1CC3-54C7
    -----------------

    J'obtiens bien le résultat escompté : 1CC3-54C7

    alors que la page de code est 850 (entre les -------------) :

    -----------------
    C:\Test>chcp
    Page de codes active*: 850
    -----------------

    Ce qui m'intrigue c'est la différence de comportement selon qu'on est en ligne de commande ou dans un fichier batch.

    Je n'ai pas réussi à trouver le moindre indice en fouillant sur le net.

    Merci encore, umfred, pour cette aide.

  7. #6
    KCRATSA

    Re : Utilisation de FINDSTR dans un fichier de commandes (batch)

    Je pense avoir trouvé une piste intéressante :
    Au lieu de NOTEPAD.EXE de Windows pour créer le fichier T1.BAT, j'ai utilisé NOTEPAD++.EXE version 8.4.9 qui comporte plus de possibilité d'encodage, (je n'ai pas essayé d'autres versions) :

    -------------------------
    @REM Pour vérifier la page de code existante :
    CHCP

    FOR /F "tokens=8 delims= " %%i in ('VOL M: ^| FINDSTR /i /c:"Le numéro de série du volume"') do @ECHO %%i

    @REM Pour empêcher la fermeture de la fenêtre :
    PAUSE
    -------------------------

    Avant d'enregistrer je configure l'encodage dans NOTEPAD++ :
    Menu - Encodage > Codage de caractères > Langues d'Europe occidentale > OEM 863:français

    J'enregistre le fichier batch ainsi créé

    Résultat de son exécution :

    --------------------------
    C:TEST>CHCP
    Page de codes active*: 850

    C:TEST>FOR /F "tokens=8 delims= " %i in ('VOL m: | FINDSTR /i /c:"Le numéro de série du volume"') do @ECHO %i
    1CC3-54C7

    C:TEST>PAUSE
    Appuyez sur une touche pour continuer...
    --------------------------

    J'obtiens bien le numéro de série du disque.

    J'ai aussi essayé l'encodage avec OEM 850, OEM 858, OEM 860ortugais et même avec OEM US ça marche aussi (je suppose 437).
    C'est donc bien l'encodage du fichier batch qui est à l'origine de ce problème avec FINDSTR mais il n'est pas nécessaire que l'encodage du fichier batch soit strictement identique à celui de la fenêtre pourvu qu'il reste dans la gamme 850, 858, 863 et même 437.

  8. #7
    JPL
    Responsable des forums

    Re : Utilisation de FINDSTR dans un fichier de commandes (batch)

    Sinon il y a toujours le bon vieux bloc-note de Windows

    Pour un batch c’est suffisant, je pense.
    Rien ne sert de penser, il faut réfléchir avant - Pierre Dac

  9. #8
    KCRATSA

    Re : Utilisation de FINDSTR dans un fichier de commandes (batch)

    Bonjour,

    Merci JPL pour la remarque, mais "le bon vieux bloc-note de Windows", n'est-ce pas justement l'exécutable nommé NOTEPAD.EXE qui se trouve dans 'C:\Windows' mais qui n'offre pas suffisamment de choix d'encodage et auquel je fais justement référence ?

  10. #9
    umfred

    Re : Utilisation de FINDSTR dans un fichier de commandes (batch)

    si
    Mais là ne semble pas être le problème. si on envoie le résultat de "vol m:" dans un fichier texte (vol m:>vol.txt), on voit que l'accent n'y ai pas toujours (il y a aussi l'encodage du fichier qui peut jouer) Et même quand l'accent est présent, le findstr ne marche pas (sur la commande) quand j'ai fait quelques tests. Peut-être alors utilisé le fichier ?

  11. #10
    KCRATSA

    Re : Utilisation de FINDSTR dans un fichier de commandes (batch)

    Effectivement, si on envoie le résultat de VOL M: dans le fichier texte VOL.TXT, on remarque que NOTEPAD.EXE ne décode pas les caractères accentués, par contre, dans la fenêtre de commande, si on affiche le contenu du fichier VOL.TXT (TYPE VOL.TXT) les accents sont bien affichés.

    Dans mon post initial j'avais déjà signalé ce point :
    "C'est la même chose si j'envoie le résultat de VOL M: dans un fichier texte intermédiaire et que je filtre avec FINDSTR."

    J'ai donc essayé ce qui suit :
    Dans une fenêtre de commandes, j'ai lancé les commandes suivantes
    CHCP 1252
    VOL M: > VOL.TXT
    TYPE VOL.TXT
    Les accents sont affichés, même en ouvrant le fichier avec NOTEPAD.EXE.

    Je pense plutôt que problème vient de FINDSTR qui ne reconnait que les codages de base (437, 850, 863, etc...) pour faire ses recherches sur les chaines de caractères.

    Mais je n'ai pas les connaissances nécessaires pour le démontrer.

    De toute façon je considère que mon problème est résolu, et, à l'avenir j'utiliserai un éditeur comme NOTEPAD++ pour réaliser des fichiers batch (surtout en la présence de caractères accentués).

    Et encore merci.
    Dernière modification par KCRATSA ; 24/02/2023 à 12h05.

  12. #11
    JPL
    Responsable des forums

    Re : Utilisation de FINDSTR dans un fichier de commandes (batch)

    Citation Envoyé par KCRATSA Voir le message
    Bonjour,

    Merci JPL pour la remarque, mais "le bon vieux bloc-note de Windows", n'est-ce pas justement l'exécutable nommé NOTEPAD.EXE qui se trouve dans 'C:\Windows' mais qui n'offre pas suffisamment de choix d'encodage et auquel je fais justement référence ?
    Exact, je n’avais pas fait attention. Le bloc-note c’est de l’ASCII brut de décoffrage. Normalement c’est compatible avec un batch. Maintenant s’il est capable d’afficher les caractères accentué, bien entendu il ne faut pas les employer dans un batch... à moins que Windows ait fait de gros progrès ?
    Rien ne sert de penser, il faut réfléchir avant - Pierre Dac

Discussions similaires

  1. Ecrire fichier txt en batch
    Par electrique10 dans le forum Programmation et langages, Algorithmique
    Réponses: 10
    Dernier message: 20/01/2015, 11h13
  2. pb creation fichier batch avec espaces
    Par invite32a0740b dans le forum Programmation et langages, Algorithmique
    Réponses: 9
    Dernier message: 24/07/2014, 09h52
  3. Supprimer espaces dans un fichier txt avec un batch
    Par inviteccee45bb dans le forum Logiciel - Software - Open Source
    Réponses: 6
    Dernier message: 24/07/2010, 11h26
  4. aide batch fichier private
    Par invite6bd30976 dans le forum Logiciel - Software - Open Source
    Réponses: 1
    Dernier message: 16/01/2010, 07h44
  5. Utilisation d'un fichier téléchargé dans Vegas
    Par invitea7fcfc37 dans le forum Logiciel - Software - Open Source
    Réponses: 4
    Dernier message: 04/03/2006, 22h51