1

Je veux recuperer le contenu d'un dossier en batch. Après plusieurs coupes lourdingues, j'arrive à ca :

10/03/2006  13:22    <REP>          default user
11/04/2006  02:55    <REP>          all users
22/06/2007  19:46    <REP>          localservice
22/06/2007  19:46    <REP>          networkservice
12/07/2007  20:08    <REP>          moi


Soit le code suivant :

for /F "tokens=1,4" %%a in (cat) do (
set d=%%a
set n=%%b
echo %b%
set /a l+="1"


J'obtiens ça :

moi
moi
moi
moi
moi
5


Je change le echo %b% en echo !b! et j'obtiens...

!b!
!b!
!b!
!b!
!b!
5


gol bang angry mur mad mad bang mur gol#trigol# forbidden

Donc ma question est la suivante : comment faire pour que le batch affiche bien le contenu de la variable en cours de traitement ? :/

2

Tu es vraiment _obligé_ d'utiliser le batch DOS/Windows ? Ce n'est pas le langage le mieux adapté à ce type de traitements (mais je pense qu'au cas où tu ne l'aurais pas déjà su, tu t'en es un peu rendu compte) ^^
(C'est pas l'OS le mieux adapté à ce type de traitements pourtant simples non plus, d'ailleurs, mais j'imagine que tu n'as pas le choix).
avatar
Membre de la TI-Chess Team.
Co-mainteneur de GCC4TI (documentation en ligne de GCC4TI), TIEmu et TILP.
Co-admin de TI-Planet.

3

euh mais dir /b ça affiche juste le contenu ? et tu peux l'exporter, j'ai pas pigé ce que tu veux faire et le probleme là.
avatar

4

Non j'ai pas le choix, on me l'a demandé de façon que ce soit en batch et rien d'autre, parce que le mec que j'observe en stage ne fait confiance qu'au batch. -_- Résultat, j'apprends sur le tas :/
Ce que je veux faire est simple : compter le nombre d'andouilles dans le répertoire "documents and settings" de chaque pc via son hostname grâce à une liste de hostname toute bête où ils sont empilés les uns sous les autres, sans comptabiliser "administrator" "default user" et "all users" ainsi que récupérer la date à laquelle un péquenot qui l'a utilisé en dernier.

Je viens de réussir à faire ça au prix de quelques pirouettes crades, le problème, c'est que j'ai l'impression qu'il fait la moitié de ce que je lui dis de faire (genre il fait pas le truc à la première exécution, mais ensuite il fait tout ça tout bien à la deuxième neutral) et la syntaxe est vraiment pourrie.


5

Edited_3535

6

Par contre maintenant, il est incapable de m'afficher le nombre correct de lignes d'un fichiers furieux
for /F %%i in (fichier.txt) do (
set /a l+="1"
)

echo %l%


résultat : 0 malgré le fait que set l me donne l=le bon nombre de lignes gol

7

avatar
Si Dieu m'a de nouveau fait homme, cette fois il m'a pas raté : marcher sur l'eau et dupliquer les pains, ça marche p'us :/

8

Non, je ne _peux pas_ utiliser des batchs qui servent à l'exécution d'autres batchs...
Bon finalement j'ai plus ou moins réussi, le problème, c'est que je ne comprends pas pourquoi il faut que mon batch s'exécute deux fois pour afficher les bons résultats :/

9

J'ai souvent été obligé d'utiliser le batch et c'est en effet infame. En particulier sa gestion des variable très tordue qui est à se taper la tête contre les murs.

Pour simplifier un set a l'interieur d'un séquence entre parenthèse n'aura pas d'éffet à l'intérieur de la séquence. Dans certains cas pour contourner ton problème tu pourras utiliser l'expension retardée des variables:
extrait du help set:
L'expansion retardée de variables d'environnement vous permet d'utiliser un autre caractère (le point d'exclamation) afin d'étendre les variables d'environnement durant l'exécution. Si l'expansion retardée de variables est activée, les exemples ci-dessus peuvent être écrits comme suit afin de fonctionner comme vous le souhaitez :

set VAR=avant
if "%VAR%" == "avant" (
set VAR=après
if "!VAR!" == "après" @echo Cela marche si vous lisez ce message
)

set LIST=
for %i in (*) do set LIST=!LIST! %i
echo %LIST%


Personellement javais pris l'habitude de déléger le travail a une precédudre quand c'était possible. Par exemple:
for .......... (
    call tache %param1% %param2%
)
goto :eof

:tache
rem tache a effectuer %1 et %2 contienent les valeurs de param1 et param2
...
goto :eof
avatar

10

[nosmile]
Yoshi Noir (./1) :
for /F "tokens=1,4" %%a in (cat) do ( set d=%%a set n=%%b echo %b% set /a l ="1"

Yoshi Noir (./8) :
Non, je ne _peux pas_ utiliser des batchs qui servent à l'exécution d'autres batchs... Bon finalement j'ai plus ou moins réussi, le problème, c'est que je ne comprends pas pourquoi il faut que mon batch s'exécute deux fois pour afficher les bons résultats :/
Si mais il faut lancer les autre batch avec "call monbatch.bat" et ne pas utisiser la commande "exit" mais "goto :eof" dans le batch appellé.

Si tu veux utiliser un autre batch comme procédure tu peux tout inclure dans le même fichier en faisant une structure du style:
rem début du main
....
call procedure %param1%
call procedure2 %param1% %param2%
....
goto :eof
rem Fin du main

:procedure
echo Procedure avec le parametre %1
goto :eof

:procedure2
echo Procedure avec les parametres %1 et %2
goto :eof
avatar

11

Dans mon ./6 je voulais afficher le nombre de lignes après le traitement dans la boucle for.
En réécrivant la boucle for avec un nom variable différent, cette fois-ci ça marche...
Dès qu'on veut faire un truc pointu, le batch, ça a l'air totalement aléatoire...

Pour finir, je devais faire ce batch pour quelqu'un qui doit faire des vérifications rapides sur un potentiel de 5000 postes. Le but étant aussi de faire un outil efficace qui ne nécessite pas une trouzaine de fichiers :/

12

Si tu utilise des call avec un label, tu peut normalement tout rentrer dans un seul fichier.
avatar

13

for /F "tokens=1,4" %%a in (cat) do ( 
set d=%%a 
set n=%%b 
echo %b% 
set /a l+="1" 


set d=%a% 
set n=%b%


ça ne serait pas mieux ?
avatar
Proud to be CAKE©®™


GCC4TI importe qui a problème en Autriche, pour l'UE plus et une encore de correspours nucléaire, ce n'est pas ytre d'instérier. L'état très même contraire, toujours reconstruire un pouvoir une choyer d'aucrée de compris le plus mite de genre, ce n'est pas moins)
Stalin est l'élection de la langie.

14

Il me semble que non. Une autre débilité de batch est sa gestion des variables for.
avatar

15

toutafé.

Bon pour ceux que ça intéresse de savoir le dernier user récent d'un poste en réseau avec un os NT, voici le code :

@echo off

set /a l="0"
cls

for /F %%i in (liste.txt) do (

set /a l="0"

dir \%%i\c$\DOCUME~1 /ad /l /o:d > grwoof
rem dir /a:d /l /o:d > grwoof

find /v "octets" < grwoof > grwoof2
find /v "." < grwoof2 > grwoof3
find /v "Le num" < grwoof3 > grwoof4
find /v "pertoi" < grwoof4 > grwoof5
find /v "default u" < grwoof5 > grwoof6
find /v "administrator" < grwoof6 > grwoof7
find /v "all u" < grwoof7 > grwoof8
find /v "service" < grwoof8 > grwoof9
del grwoof
del grwoof2
del grwoof3
del grwoof4
del grwoof5
del grwoof6
del grwoof7
del grwoof8
more grwoof9

set NL=0
set D=INCONNU
set N=INCONNU

for /F "tokens=1,4" %%A in (grwoof9) do (
set D=%%A
set N=%%B
set /A NL+=1
)

echo %%i : !NL! users trouves. Dernier user : !N! le !D!
echo ---
)

pause
del grwoof9


Le code est méga-merdique (oui, je sais que | ça existe, mais il était tard et j'avais pas le cœur à faire du btach), mais je m'en fous tongue