Variable .Bat ne conserve que la dernière ligne d'un fichier txt

Fermé
Patrickdusud_0856 Messages postés 40 Date d'inscription samedi 2 mai 2020 Statut Membre Dernière intervention 24 mai 2022 - 16 nov. 2021 à 01:45
brucine Messages postés 14327 Date d'inscription lundi 22 février 2021 Statut Membre Dernière intervention 26 avril 2024 - 17 nov. 2021 à 11:19
Bonjour, depuis ce matin j'essai de créer un fichier .bat, sans succès.

J'essaye d'insérer plusieurs ligne du résultats d'une commande d'un fichier texte dans une variable.

wmic diskdrive get serialnumber > numerodeserie.txt

FOR /F "tokens=1-2 USEBACKQ" %%F IN (`more numerodeserie.txt`) DO (
SET var=%%F
)
pause
ECHO %var%
pause

IF %var% == 123 (GOTO :Depart) else (GOTO :Erreur)

:Depart
echo Bon numéro
pause

:Erreur
echo Erreur de numéro
pause


Le problème étant que la commande
wmic diskdrive get serialnumber > numerodeserie.txt
créé un fichier sur 3 lignes. De ce fait lors de la création de la variable celle ci créé la variable uniquement avec la dernière ligne.

Deuxième question :

Lors de mon IF/GOTO je voudrais que l'intégralité des numéros soit comparé à 123.

Par exemple si la variable porte la valeur 599 123 888 je voudrais repartir sur :Depart car la chaine contient les chiffres 123.

Merci pour votre aide.
A voir également:

3 réponses

jordane45 Messages postés 38145 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 25 avril 2024 4 650
16 nov. 2021 à 06:45
Bonjour
Essaye avec >> au lieu d'un seul >
1
Patrickdusud_0856 Messages postés 40 Date d'inscription samedi 2 mai 2020 Statut Membre Dernière intervention 24 mai 2022 2
16 nov. 2021 à 12:12
Bonjour Jordane45, merci pour ta réponse, malheureusement cela ne fonctionne pas.
0
barnabe0057 Messages postés 14440 Date d'inscription lundi 2 mars 2009 Statut Contributeur Dernière intervention 19 avril 2024 4 908
Modifié le 16 nov. 2021 à 06:50
Bonjour,

Pas besoin de fichier texte, voilà un exemple :

FOR /F "skip=1 delims=" %%A in ('wmic diskdrive get serialnumber ^| findstr .') DO SET "var=%%A"

ECHO %var%
pause

echo %var% | findstr "123" >nul && GOTO :Depart || GOTO :Erreur

:Depart
echo Bon numéro
pause

:Erreur
echo Erreur de numéro
pause


Si tu as des questions/remarques n'hésite pas.

1
brucine Messages postés 14327 Date d'inscription lundi 22 février 2021 Statut Membre Dernière intervention 26 avril 2024 1 816
16 nov. 2021 à 08:09
Bonjour,

Si l'on veut électivement obtenir le numéro de série d'un seul des disques, il y a des contournements, par exemple concernant le premier disque:

wmic path win32_diskdrive where deviceid='\\\\.\\PHYSICALDRIVE0' get serialnumber
0
Patrickdusud_0856 Messages postés 40 Date d'inscription samedi 2 mai 2020 Statut Membre Dernière intervention 24 mai 2022 2
16 nov. 2021 à 12:19
Bonjour Bernabé, merci pour ta réponse, le code enregistre uniquement la dernière ligne dans la variable :

D:\>FOR /F "skip=1 delims=" %A in ('wmic diskdrive get serialnumber | findstr .') DO SET "var=%A"

" \>SET "var=ACE4_2E00_9537_B638.

" \>SET "var=0101d18be0e9c7afa7cb

D:\>ECHO 0101d18be0e9c7afa7cb
0101d18be0e9c7afa7cb

D:\>pause
Presione una tecla para continuar . . .


Je souhaiterai enregistrer toutes les lignes pour les comparer à la fin. Mais merci, car le fait de ne pas créer un fichier texte est une meilleure alternative tout de même.

Il faudrait soit créer une variable par ligne et les comparer en même temps par la suite, soit arriver à faire rentrer tout le résultat dans la même variable.

Concernant le fait de sélectionner un disque, cela n'est pas possible, car les résultats sont susceptibles de varié d'un PC à l'autre, j'aurais besoin de récupérer tous les numéros de série.
0
brucine Messages postés 14327 Date d'inscription lundi 22 février 2021 Statut Membre Dernière intervention 26 avril 2024 1 816 > Patrickdusud_0856 Messages postés 40 Date d'inscription samedi 2 mai 2020 Statut Membre Dernière intervention 24 mai 2022
16 nov. 2021 à 13:15
Bonjour,

Si je veux isoler chaque variable, je dois passer par l'extension avec quelque chose de ce type (j'ai utilisé volumeserialnumber parce que je n'ai qu'un disque):


SETLOCAL ENABLEDELAYEDEXPANSION

SET Serial=

FOR /F "skip=1 tokens=1,2,3 delims=: " %%a in ('wmic logicaldisk where drivetype^=3 get name^,volumename^,volumeserialnumber^| findstr /v /r "^$"') DO (
SET "Serial=%%c"
ECHO !Serial!
)


Les variables sont doublées parce que c'est un batch: à la place de ECHO, je redirige maintenant la variable séparément où je veux (texte, commande...) à chaque itération.
0
barnabe0057 > Patrickdusud_0856 Messages postés 40 Date d'inscription samedi 2 mai 2020 Statut Membre Dernière intervention 24 mai 2022
Modifié le 16 nov. 2021 à 13:38
A tester dans un fichier .bat, pas dans la console :

setlocal enabledelayedexpansion
FOR /F "skip=1 delims=" %%A in ('wmic diskdrive get serialnumber ^| findstr .') DO (
 echo %%A | findstr "123" >nul && set match=1
)

if !match! equ 1 (goto :Depart) else (goto :Erreur)

:Depart
echo Bon numéro
pause

:Erreur
echo Erreur de numéro
pause
0
Patrickdusud_0856 Messages postés 40 Date d'inscription samedi 2 mai 2020 Statut Membre Dernière intervention 24 mai 2022 2
17 nov. 2021 à 10:48
Merci pour vos réponses trés rapide. Barnabe0057, votre code fonctionne parfaitement.

Cependant, je ne comprends pas toutes les fonctions à l'intérieur de la boucle. Pourriez-vous m'expliquer le code, je vous en serais très reconnaissant. Ceci me permettra de résoudre par moi-même un problème similaire dans le futur

Merci encore à tous pour votre aide.
0
brucine Messages postés 14327 Date d'inscription lundi 22 février 2021 Statut Membre Dernière intervention 26 avril 2024 1 816
17 nov. 2021 à 11:19
Bonjour,

-Pour qu'une variable soit testée à chaque itération (et pas seulement la dernière)
on doit préciser setlocal enabledelayedexpansion et exprimer la variable comme !match! et non pas %match%
-Pour chercher des caractères dans la sentence wmic, on doit la rediriger vers findstr, mais le caractère de redirection (pipe |) est mal lu à la ligne de commande et on doit donc "l'échapper" par ^; le point . est un joker prescrivant de rechercher tous les caractères, et skip=1 prescrit de ne pas faire la recherche dans la première ligne des résultats wmic (titres).
-sur le même principe, à la deuxième ligne, si la variable contient les caractères "123" (c'est textuel, entre guillemets), on en redirige le résultat de manière qu'il ne soit jamais lu (redirection >nul) et le paramètre && n'exécute la deuxième commande (attribuer à la variable match la valeur 1) que si la première condition (existence des caractères 123) est remplie.

Enfin, certaines fonctions ou commandes exécutées dans une boucle nécessitent d'être spécifiées non pas entre guillemets, comme le veut l'usage général, mais entre apostrophes, c'est le cas de wmic.

Il suffit ensuite de tester la valeur de match.
1