=> 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:

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
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"


a- Chercher les noms de fichiers qui contiennent des espaces


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
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 
:: 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"

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 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:\mon dossier test => Nom Long
C:\MONDOS~1         => Nom Court
=> pour les dossiers: 6 caractères pour le nom + 2 caractères pour l'identifiant "~x"

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

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
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"

For %%a in (*) do echo %%~sa

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
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 /?)

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
Pour enlever les tabulation d'un fichier on pourra faire:

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

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 :::::::::::::
c- VBS

Ici on va utiliser la fonction vbs LTrim() "L = Left"

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="^&LTrim("%Str%")
   cscript //nologo ~.vbs >~.bat  
   for %%: in ("call ~.bat Str","del ~.vbs ~.bat") do %%~:
 popd
 echo [%Str%]
goto:EOF ::::::::::::::::::::: By Walid ::::::::::::::::::
B) au debut et en fin du String:

a- CALL

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 :::::::::::::
b- avec Gnu Sed

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:::::::
breve explication:

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"
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
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

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 au debut de la chaîne
"[ ]$" => espace à la fin de la chaîne

e- VBS

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 ::::::::::::::::::
On va utiliser la fonction vbs TRIM().

Voici un petit script hybrid pour tester vos chaînes de caractères:


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 :::::::::::::::::::::::::::
** Tout autre contribution/critique est la bien venue **