salut,

Beaucoup de batcheurs croient que les paramètres sont le seul moyen d'alimenter nos scripts par des données

par exemple ce script permet de grouper les extensions des fichiers.


Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
:::::::::::::::::::::::::::::::::::::::::::::
:USAGE
::    GroupbyExtension <Path>
:PARAMETER <Path> 
::    Par defaut c'est le chemin en cours
:EXAMPLE
::    GroupbyExtension "c:\a b c\d"
::
:::::::::::::::::::::::::::::::::::::::::::::
@Echo oFF&Setlocal Enabledelayedexpansion
set $Path="%~1.\"

For /f "Delims=" %%i in ('dir %$Path% /a-d/b') do (
   Set /a %%~xi+=1
)
Echo Count  Extension
Echo -----  ----------
For /f "tokens=1* Delims==" %%o In ('set .') Do (
  Set cnt=0000%%p
  Echo(!Cnt:~-4!    %%o
)
goto :eof
notre script sera executer ainsi:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
c:\> GroupByExtension d:\windows\system32
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Count  Extension
-----  ----------
0001    .avi
0001    .BAK
0013    .bmp
0002    .dat
0003    .dll
0010    .exe
0010    .ini
0030    .log
0001    .Manifest
0001    .OLD
0001    .pif
0002    .prx
0001    .scf
0003    .tmp
0003    .txt
comme vous pouvez le voir nous pouvons alimenter notre script par des données par le biais de paramètres, dans notre cas l'argument de notre commande sera capturer par les réferences d'arguments (%1..%9)

On peux alimenter nos scripts par l'entrée du pipeline, de deux manières, la première cassera la progression du pipeline à la première chaîne de caractères rencontrée, et la seconde, jouera le rôle d'un filtre

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
# BREAK
c:\temp> type method1.cmd

@echo off
set /p FirstLine=
rem recupération de la première entrée du pipeline
rem et un petit traitement
echo première ligne: "%FirstLine: =" "%"

c:\temp> dir|method1.cmd
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
# PROGRESS
c:\temp> type method2.cmd

@echo off
for /f "tokens=*" %%a in ('find /n /v ""') do (
    set "n=%%a"
    setlocal enabledelayedexpansion
    echo(# !n:*]=!
    endlocal
 ) 

c:\temp> dir | method2.cmd
revenons maintenant à notre script initial..on peux ainsi le changer pour qu'il traite l'entrée du pipeline:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
:::::::::::::::::::::::::::::::::::::::::::::
:USAGE
::    echo <chemin> | GroupbyExtension
:EXAMPLE
::    echo c:\ | GroupbyExtension
::
:::::::::::::::::::::::::::::::::::::::::::::
@Echo oFF&Setlocal Enabledelayedexpansion
Set /P $Path=
For /f "Delims=" %%i in ('dir %$Path% /a-d/b') do (
   Set /a %%~xi+=1
)
Echo Count  Extension
Echo -----  ----------
For /f "tokens=1* Delims==" %%o In ('set .') Do (
  Set cnt=0000%%p
  Echo(!Cnt:~-4!    %%o
)
goto :eof
désormais, il sera executer ainsi:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
echo d:\windows\system32 | GroupByExtension.cmd
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Count  Extension
-----  ----------
0001    .avi
0001    .BAK
0013    .bmp
0002    .dat
0003    .dll
0010    .exe
0010    .ini
0030    .log
0001    .Manifest
0001    .OLD
0001    .pif
0002    .prx
0001    .scf
0003    .tmp
0003    .txt
walid