=> cette page sera mise à jour
Salut,
en scripting on est souvent confronté devant des problèmes d'espaces dans les noms de fichiers/dossiers ou dans des chaînes de caractères.
1) noms de fichiers/dossiers comportants des espaces:
On va essayer d'extraire uniquement les fichiers qui contiennent des espaces puis on va faire le contraire "le tout sans passer par des boucles FOR"
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 c:\>Dir /a:-d /b ttl.txt mon fichier.txt test gui.py mon autre fichier.txt script.vbs script 2.vbs code.bat
a- Chercher les noms de fichiers qui contiennent des espaces
on peut raccourcir l'expression comme ceci:
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 Dir *.* /a:-d /b | Find " " :: filter tous les fichiers mon fichier.txt mon autre fichier.txt test gui.py script 2.vbs Dir *.txt /a:-d /b | Find " " :: filtrer les fichiers .TXT mon fichier.txt mon autre fichier.txt Dir *.txt *.vbs /a:-d /b | Find " " :: filtrer les .TXT et .VBS mon fichier.txt mon autre fichier.txt script 2.vbs
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 Dir "* *.*" /a:-d /b :: filter tous les fichiers mon fichier.txt mon autre fichier.txt test gui.py script 2.vbs Dir "* *.txt" /a:-d /b :: filtrer les fichiers .TXT mon fichier.txt mon autre fichier.txt Dir "* *.txt" "* *.vbs" /a:-d /b :: filtrer les .TXT et .VBS mon fichier.txt mon autre fichier.txt script 2.vbs
b- Chercher les noms de fichiers qui ne contiennent pas d'espaces
On utilisera dans ce cas le commutateur /v
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 Dir *.* /a:-d /b | Find /v " " :: filter tous les fichiers ttl.txt script.vbs code.bat Dir *.txt /a:-d /b | Find /v " " :: filtrer les fichiers .TXT ttl.txt Dir *.txt *.vbs /a:-d /b | Find /v " " :: filtrer les fichiers .TXT et .VBS script.vbs
2) Supprimer les espaces dans les noms de fichiers:
Le plus simple est d'utiliser une boucle FOR /F + les variables de substitutions (voir dans la FAQ Batch)
3) Utilisation des noms courts:
Les noms courts nous permettent d'utiliser des noms de fichiers/dossiers sans nous souciers des
problèmes d'espaces.
Exemple: On va créer un fichier "c:\Bonjour maitre.html" et un dossier "c:\mon dossier test"
=> pour les fichiers: 6 caractères pour le nom + 2 caractères pour l'identifiant "~x" + l'extension
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 c:\Bonjour maitre.html => Nom Long c:\BONJOU~1.HTM => Nom Court
=> pour les dossiers: 6 caractères pour le nom + 2 caractères pour l'identifiant "~x"
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 c:\mon dossier test => Nom Long C:\MONDOS~1 => Nom Court
L'identifiant est un nombre qui va s'incrémenter s'il y a un autre fichier/dossier
qui a les mêmes 6 premiers caractères.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 Noms court Nom long ------------------------------------- MONDOS~1 Mon dossier de test a MONDOS~2 Mon dossier de test b MONDOS~3 Mon dossier de test c
a- la commande DIR avec son commutateur /x
b- la variable de substitution %~sa et %%~sa
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 c:\> Cat ncourt.bat :::::::::::::::::::::::::::::::::::::::::::: @echo off MkDir $ ChDir $ cd.>"Mon fichier de Test 1" cd.>"Mon fichier de Test 2" cd.>"Mon fichier de Test 3" dir /x | Find "Mon fichier de Test" ChDir .. RmDir $ /s /q goto:EOF ::::::::::::::::::::::::::::::::::::::::::::: c:\> ncourt.bat
c- les paramètres de substitution %~sx
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 c:\> Cat ncourt.bat :::::::::::::::::::::::::::::::: @echo off MkDir $ ChDir $ cd.>"Mon fichier de Test 1" cd.>"Mon fichier de Test 2" cd.>"Mon fichier de Test 3" For %%a in (*) do echo %%~sa ChDir .. RmDir $ /s /q goto:EOF ::::::::::::::::::::::::::::::::: c:\> ncourt.bat
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 c:\> Cat ncourt.bat ::::::::::::::::::::::::::::::::::: @echo off if exist %1 Call :NomCourt %1 goto:EOF :NomCourt echo %~s1 ::::::::::::::::::::::::::::::::::: c:\> ncourt.bat "mon fichier 3.txt"
4) La commande MORE et la gestion des tabulations:
on va utiliser le commutateur /T (voir MORE /?)
Pour enlever les tabulation d'un fichier on pourra faire:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 @echo off MkDir ^^ ChDir ^^ ECHO>tab ceci est un test REM ceci[TAB]est[TAB]un[TAB]test FOR /L %%u In (8,-1,1) Do More /T%%u tab ChDir .. RmDir ^^ /s /q goto:EOF
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 MORE /T1 infile > Oufile
5) "DELIMS=" VS "TOKENS=*"
"DELIMS=" Va conserver les espaces de la chaîne de caractères
"TOKENS=*" Va supprimer les espaces en début de chaîne
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 @echo off&(set Str= Ceci est un test ) :::::::::::::::::::::::::::::::::::::::::::::::::::::::::: for /f "tokens=*" %%i in ("%Str%") do Set Token=%%~i for /f "delims=" %%i in ("%Str%") do Set Delim=%%~i for /f "tokens=*" %%i in ('echo\%Str%') do Set Echot=%%~i for /f "delims=" %%i in ('echo\%Str%') do Set Echod=%%~i echo. echo Str_Origin=[%Str%] echo Token-Echo=[%Token%] echo Delim-Echo=[%Delim%] echo Token+Echo=[%Echot%] echo Delim+Echo=[%Echod%] echo. goto:EOF :::::::::::::::: By Walid ::::::::::::::::::::::::
6) Suppression des espaces dans une chaîne de caractères:
A) au debut du String:
a- FOR+TOKENS
On va utiliser l'option "TOKENS" qui va nous permettre de supprimer
les espaces du début
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 @echo off Setlocal&::::::::::::::::::::::::::::::::::::::::::::::: (set Str= ceci est un test ) Echo [%Str%] For /f "tokens=*" %%a in ("%Str%") do Set "Str=%%~a" Echo [%Str%] Endlocal&goto:EOF :::::::By Walid ::::::::::::::::::::::
b- Call+Substitution_de_variable
le "#_#" va nous aider à conserver les espaces de fin de la chaîne
c- VBS
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 @echo off&:::::::::::::::::::::::::::::::::::::::: (set Str= ceci est un test ) echo:[%Str%] call:[Trim] %Str%#_# echo:[%Str:#_#=%] goto:EOF :[Trim] (set Str=%*)&goto:EOF :::::::By Walid :::::::::::::
Ici on va utiliser la fonction vbs LTrim() "L = Left"
B) au debut et en fin du String:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 @echo off (set Str= ceci est un test ) :::::::::::::::::::::::::::::::::::::::::::::::::::::::::: echo [%Str%] Pushd "%Temp%" echo>~.vbs wsh.echo "set %%1="^<rim("%Str%") cscript //nologo ~.vbs >~.bat for %%: in ("call ~.bat Str","del ~.vbs ~.bat") do %%~: popd echo [%Str%] goto:EOF ::::::::::::::::::::: By Walid ::::::::::::::::::
a- CALL
b- avec Gnu Sed
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 @echo off&:::::::::::::::::::::::::::::::::::::::: (set Ch= ceci est un simple test ) echo:[%Ch%] call:[Trim] %Ch% echo:[%Ch%] goto:EOF :[Trim] (set Ch=%*)&goto:EOF :::::::By Walid :::::::::::::
breve explication:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: @echo off& (set Ch= ceci est un simple test ) :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: echo [%Ch%] echo\%Ch%|1>&0 sed "s_^\s*__;s_\s*$__;s_^_del %%0\&set %%1=&_w ~.Cmd" 2>Nul=(call ~.Cmd ch) echo [%Ch%]&goto:EOF :::::::::By Walid:::::::GnuSED Version 4.2:::::::
c- IF+GOTO+Substitution_de_variable
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 s_^\s*__; On supprime les espaces en debut de la chaîne s_\s*$__; On supprime les espaces à la fin de la chaîne s_^_ On se positionne au debut de la chaîne et On écrit: del %%0 "Del" suivi du paramètre "%0" qui est en réalité le nom du fichier \& On échappe le caractère de concaténation "&" set %%1= On créer une variable portant le nom du premier paramètre & On écrit le resultat obtenu par SED dans _w ~.Cmd un fichier "~.Cmd" Call ~.Cmd On appel le fichier ~.Cmd en ch lui envoyant le paramètre "ch"
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 :::::::::::::::::::::::::::::::::::::::::::::::::::::::: @echo off (set Ch= ceci est un simple test ) echo [%ch%] :Trim If ["%ch:~0,1%"]==[" "] ( Set "Ch=%Ch:~1%" Goto:Trim ) Else If ["%ch:~-1%"]==[" "] ( Set "Ch=%Ch:~0,-1%" Goto:Trim) echo [%Ch%] goto:EOF ::::::::::::::::::: By I'm_HERE ::::::::::::::::
d- FindStr et ses RegExp
"^[ ]" => espace au debut de la chaîne
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 @echo off (set Str= ceci est un simple test ) echo [%str%] :Loop echo\%str%|1>nul findstr /rc:"^[ ]"&&(Set Str=%Str:~1%&goto:Loop) echo\%str%|1>nul findstr /rc:"[ ]$"&&(Set Str=%Str:~,-1%&goto:Loop) echo [%str%] goto:EOF ::::::::::::::::::::By Walid:::::::::::::::::::::::::::::::
"[ ]$" => espace à la fin de la chaîne
e- VBS
On va utiliser la fonction vbs TRIM().
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 @echo off (set Str= ceci est un simple test ) :::::::::::::::::::::::::::::::::::::::::::::::::: echo [%Str%] Pushd "%Temp%" echo>~.vbs wsh.echo "set %%1="^&Trim("%Str%") cscript //nologo ~.vbs >~.bat for %%: in ("call ~.bat Str","del ~.vbs ~.bat") do %%~: popd echo [%Str%] goto:EOF ::::::::::::: By Walid ::::::::::::::::::
Voici un petit script hybrid pour tester vos chaînes de caractères:
** Tout autre contribution/critique est la bien venue **
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
23
24
25
26
27
28
29 @echo off If %1/==/ ( echo. echo USAGE: %~nx0 " chaine de caractŠre " [OPT] echo OPT: echo L = Left echo R = Right echo. echo EXEMPLES: %~nx0 " petit test " echo %~nx0 " petit test " L echo %~nx0 " petit test " R echo. Goto:EOF ) setlocal & set Str=%~1 ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: echo [%Str%] Pushd "%Temp%" echo>~.vbs wsh.echo "set %%1=" ^& %2Trim("%Str%") cscript /nologo ~.vbs >~.bat for %%: in ( "call ~.bat Str" "del ~.vbs ~.bat" ) do %%~: popd echo [%Str%] Endlocal goto:EOF ::::::::::::: By Walid :::::::::::::::::::::::::::
Partager