Batch DOS problème de synthaxe avec FOR

Fermé
Mephistø Messages postés 3 Date d'inscription mercredi 20 juillet 2011 Statut Membre Dernière intervention 26 juillet 2011 - 20 juil. 2011 à 10:45
cchristian Messages postés 921 Date d'inscription lundi 21 janvier 2008 Statut Membre Dernière intervention 6 mars 2012 - 28 juil. 2011 à 11:05
Bonjour,


J'ai besoin de faire un petit batch qui execute des commandes sur un système distant après incrémentation d'une variable (concatennée). La variable a pour valeur maximum le nombre nombre de lignes contenues dans un fichier text que je récupère en local.

J'ai l'impression que je me trompe qqe part dans la synthaxe, en fonction de l'endroit ou je place ma parenthèse j'ai des erreurs différentes.

Voici le contenu de mon fichier qui pose problème :

set k=0
set z=0

for /F %%i in (C:\chemin\fichier.ini) do (
set /A k=k+1
set num=%z%%k%
net use \\fr-%MAG%ti%num%.domaine PW /USER:admin

psexec -i \\fr-%MAG%ti%num%.domaine taskkill /f /im cmd.exe

psexec -i \\fr-%MAG%ti%num%.domaine taskkill /f /im java.exe

psexec -i -d \\fr-%MAG%ti%num%.domaine shutdown /r /f /t 005)


Placé comme ca, la variable k ne s'incrémente pas, placée après les caractères "set /A k=k+1" la variable s'incrémente bien, mais logiquement, le reste des commandes ne s'executent pas plus d'une fois (avec la dernière valeur possible pour k, sans passser par les premières valeures).

Pouvez vous m'aiguiller svp ?

Merci

A voir également:

5 réponses

cchristian Messages postés 921 Date d'inscription lundi 21 janvier 2008 Statut Membre Dernière intervention 6 mars 2012 131
20 juil. 2011 à 23:35
Bonsoir,

Le problème est vraisemblablament lié à l'expansion retardée de variables qui n'est pas activé dans le fichier .bat où réside le problème (faire HELP SET sous l'invite de commandes).

Autrement dit il suffit de mettre au début du fichier .bat:
SETLOCAL ENABLEdelayedExpansion
et de remplacer les "%" par des "!" qui encadrent la variable k :

set num=%z%%k% ==> set num=!z!!k!

0
Mephistø Messages postés 3 Date d'inscription mercredi 20 juillet 2011 Statut Membre Dernière intervention 26 juillet 2011
22 juil. 2011 à 09:10
Bonjour,

Merci, effectivement tout marche après les petites modifications.
Désolé mais je ne connaissait pas cette fonction en DOS j'apprend "sur le tas" dans mon nouveau boulot.

Je suis face à un autre problème : Ma syntaxe impose des noms de pc numérotés sur 2 digits (d'ou la concaténation de k et z) z étant toujours égal à zéro, j'ai donc géré les cas ou sur le site, il y à moin de 10 PC, de 01 à 09.


Il est possible d'avoir plus de 9 PC je dois donc "boucler dans ma boucle" une fois pour les pc numérotés de 01 à 09, puis les pc numérotés de 10 à + (maximum 99).

Voici donc ce que j'ai écrit :


set k=0
set z=0
set num=!z!!k!

for /F %%i in (C:\Batch\Recup_Fichiers\NbCaisses%MAG%\rbsprov.ini) do (

set /A k=k+1

if k<10 do (

net use \\fr-%MAG%ti!num!.domaine PW /USER:admin
psexec -i \\fr-%MAG%ti!num!.domaine taskkill /f /im cmd.exe
psexec -i \\fr-%MAG%ti!num!.domaine taskkill /f /im java.exe
psexec -i -d \\fr-%MAG%ti!num!.domaine shutdown /r /f /t 005

) else do (

net use \\fr-%MAG%ti!k!.domaine PW /USER:admin
psexec -i \\fr-%MAG%ti!k!.domaine taskkill /f /im cmd.exe
psexec -i \\fr-%MAG%ti!k!.domaine taskkill /f /im java.exe
psexec -i -d \\fr-%MAG%ti!k!.domaine shutdown /r /f /t 005)

)

Actuellement, mon batch écrit ainsi se ferme brutalement juste apres ma ligne "FOR" (enfin j'imagine, les pauses que j'ai placé sur les lignes avant celle ci se font, puis arrivé à la pause précédent la ligne du "FOR", le batch se ferme, malgrès le fait d'avoir activé les "echo").

Je ne peux pas savoir ou se trouve le problème car je n'ai pas le temps d'avoir d'informations avant que le batch se ferme. Y a t il une commande pour le forcer à ne pas se fermer ?

Je pense que la logique du batch est bonne et que c'est un problème de synthaxe. Je vous demande de l'aide encore une fois, désolé si je passe à coté de quelque chose d'évident, mais je n'ai pas l'habitude de scripter.

Merci pour vos réponses qui m'ont deja bien aidé ezt pour celles qui pourront m'aider sur ce point.
0
cchristian Messages postés 921 Date d'inscription lundi 21 janvier 2008 Statut Membre Dernière intervention 6 mars 2012 131
Modifié par cchristian le 23/07/2011 à 12:54
Bonjour,

Voici un corrigé. Ta logique semble correcte à cela près que les 9 premiers numéros seront 1, 2, 3, ........9 et non pas 01, 02, 03, ...... 09 (il n'y aura pas de 0 devant les 9 premiers numéros chiffres 1 à 9 comme tu sembles le penser.)

rectificatif le 23 à 12h30mn. Ne pas prendre en compte :
que les 9 premiers numéros seront 1, 2, 3, ........9 et non pas 01, 02, 03, ...... 09 (il n'y aura pas de 0 devant les 9 premiers numéros chiffres 1 à 9 comme tu sembles le penser.)

J'ai fait une confusion de raisonnement avec le problème suivant relatif à l'instruction :
set num=!z!!k!
qui doit se trouver dans la boucle de lecture du fichier de manière à faire progresser la variable num utilisée dans les instructions :
net use \\fr-%MAG%ti!num!.domaine PW /USER:admin
psexec -i \\fr-%MAG%ti!num!.domaine taskkill /f /im cmd.exe
psexec -i \\fr-%MAG%ti!num!.domaine taskkill /f /im java.exe
psexec -i -d \\fr-%MAG%ti!num!.domaine shutdown /r /f /t 005

for /F %%i in (C:\.....................) do (
set /A k = !k! + 1
set num=!z!!k!

-----------------------------

for /F %%i in (C:\.....................) do (

rem Il faut mettre les variables entre "!" sauf dans la variable
rem réceptrice de la commande SET.

set /A k = !k! + 1
set num=!z!!k!
rem "<" se code LSS (voir HELP IF sous l'invite de commandes)
rem Il n'y a pas de DO dans la commande IF.

if !k! LSS 10 (
...................................
...................................
...................................

rem Il n'y a pas de DO dans la commande ELSE.
) else (
...................................
...................................
...................................
rem Il manquait une parenthèse fermante ")".
) )


Cordialement.
Cchristian.
0
Mephistø Messages postés 3 Date d'inscription mercredi 20 juillet 2011 Statut Membre Dernière intervention 26 juillet 2011
26 juil. 2011 à 17:24
Je ne suis pas sur d'avoir compris pour les extensions retardées.

Ma question :

Si j'ajoute la ligne SETLOCAL ENABLEdelayedExpansion, les variables que je définis avec "set" par la suite sont en extension retardé mais pas celles qui se trouvent avant ?

Dans mon code, les net use utilisant la variable %MAG% et la variable !num! (ou !k!) ne marchent pas, il semble que le mdp et login soient faux. Alors que quand je lance cette commance net use dans un autre batch, sans les extensions retardées, cette commande fonctionnne avec les mdp et login précisés.

Comment faire si je dois utiliser une variable simple et une variable à extension retardé dans la même commande ? Par exemple :

net use \\fr-%MAG%ti!num!.domaine MDP /USER:admini

Pour tout te dire, j'ai fait tourner le batch sans soucis, puis j'ai voulu le fignauler en mettant des "echo" pour informer l'utilisateur, mais depuis, il ne marche plus, disant que le login ou mdp sont faux lors des net use (et de ce fait les commandes ne peuvent pas s'executer).

J'ai un doute sur ce point, car la variable %MAG% est utilisée dans des commandes avant la ligne SETLOCAL ENABLEdelayedExpansion et les commandes tournent très bien.

Ou est ce que je me vautre lamentablement ? ^^
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cchristian Messages postés 921 Date d'inscription lundi 21 janvier 2008 Statut Membre Dernière intervention 6 mars 2012 131
28 juil. 2011 à 11:05
Bonjour,

Comme première réponse générique au dernier problème posé il faut que la commande ; SETLOCAL ENABLEdelayedExpansion soit présente au début du fichier .bat. (Taper HELP SETLOCAL sous l'invite de commandes)

Je te conseille de templacer tous les "%" des variables par des "!" après avoir ajouté la commande SETLOCAL ENABLEdelayedExpansion au début de ton fichier.

Fais d'abord cette modif et tiens moi informé des résultats,
0