Menu

Extraire le chemin d'un nom de fichier complet

- - Dernière réponse : barnabe0057
Messages postés
12154
Date d'inscription
lundi 2 mars 2009
Statut
Contributeur
Dernière intervention
12 janvier 2019
- 3 janv. 2019 à 22:50
Bonjour,

Je travaille en Batch avec MS DOS.

J'ai une chaine de caractères telle que ça :
Mon\Chemin\Fichier.txt-1.0@Projet (1)

Sachant que le nombre de sous répertoires peut varier.
Ca peut être :
Mon\Chemin\A\Moi\Fichier.txt-1.0@Projet (2)

Je ne parviens pas à extraire le chemin brut (sans le fichier).
Je voudrais pouvoir avoir :
Mon\Chemin (ou Mon\Chemin\) dans le cas (1)
Mon\Chemin\A\Moi (ou Mon\Chemin\A\Moi\) dans le cas (2)

Quelqu'un a-t-il une solution ?

Merci d'avance.
Greg.
Afficher la suite 

Votre réponse

3 réponses

Meilleure réponse
Messages postés
12154
Date d'inscription
lundi 2 mars 2009
Statut
Contributeur
Dernière intervention
12 janvier 2019
2321
1
Merci
Bonjour,

Il faut utiliser les commandes prévues à cet effet :
for /f "delims=" %%A in ("Mon\Chemin\Fichier.txt-1.0@Projet^(01^)") do echo %%~dpA



“L'intelligence artificielle se définit comme le contraire de la bêtise naturelle.”

Dire « Merci » 1

Heureux de vous avoir aidé ! Vous nous appréciez ? Donnez votre avis sur nous ! Evaluez CommentCaMarche

CCM 56033 internautes nous ont dit merci ce mois-ci

Commenter la réponse de barnabe0057
0
Merci
Bonjour Barnabe0057 et merci pour la réponse rapide.

Il y a un "mais".
Dans la réponse que j'obtiens avec ta solution, il inclut la racine de travail (répertoire de travail).
Ca donne :
d:\MonRepertoire\De\Travail\Mon\Chemin\

Moi je voudrais qu'il ne reste que
Mon\Chemin
à partir de l'expression
Mon\Chemin\Fichier.txt-1.0@Projet

Je veux vraiement ici isoler toute la chaine de caractères du début jusqu'au dernier "\".

Y a-t-il une solution ?

Greg.
barnabe0057
Messages postés
12154
Date d'inscription
lundi 2 mars 2009
Statut
Contributeur
Dernière intervention
12 janvier 2019
2321 -
Ok alors il suffit de remplacer %%~dpA par %%~pA
Tout d'abord Bonne Année à toi barnabe0057 !

Je pense qu'il faut oublier la notion de chemin.
Plus globalement, j'ai une chaine de caractère :
Mon\Chemin\Fichier.txt-1.0@Projet
Je veux conserver que :
Mon\Chemin
=> c'est à dire du début de la chaine jusqu'au dernier "\".
C'est ça qui est important : du début de la chaine jusqu'au dernier "\".
Comment puis-je faire ?
barnabe0057
Messages postés
12154
Date d'inscription
lundi 2 mars 2009
Statut
Contributeur
Dernière intervention
12 janvier 2019
2321 -
Merci bonne année également.

C'est la solution que j'ai donné dans ma dernière réponse :
for /f "delims=" %%A in ("d:\Mon\Chemin\Fichier.txt-1.0@Projet^(01^)") do echo %%~pA

Si ça ne marche pas chez toi merci d'indiquer le résultat obtenu.
Le probleme avec ta solution est qu'elle ajoute systématiquement le chemin du répertoire de travail à la chaine que je lui passe.

Par exemple, lorsque je travaille dans d:\temp et que je passe "\Mon\Chemin\Fichier.txt-1.0@Projet",
je veux obtenir :
"\Mon\Chemin\" ou "Mon\Chemin\" ou "\Mon\Chemin" ou "Mon\Chemin"
mais pas :
"D:\Temp\Mon\Chemin\"
ni
"\Temp\Mon\Chemin\"

Revenons à des traitements de chaine de caractères.
J'ai
"\Mon\Chemin\Fichier.txt-1.0@Projet"
et je veux extraire
"\Mon\Chemin\"
C'est à dire DU DEBUT DE LA CHAINE AU DERNIER "\"
Je pense que comme ça la question plus ciblée.
Comment peut-on faire ça sous MS DOS ?
Commenter la réponse de Greg
Messages postés
12154
Date d'inscription
lundi 2 mars 2009
Statut
Contributeur
Dernière intervention
12 janvier 2019
2321
0
Merci
Ainsi soit-il, si tu ne veux passer par la boucle FOR ça reste faisable mais c'est un peu compliqué, voilà tu es prévenu :

@echo off
setlocal enableextensions enabledelayedexpansion
chcp 1252 >nul


:: -------------------------------------------------------
:: début du programme
:: -------------------------------------------------------

set "chaine=Mon\Chemin\Fichier.txt-1.0@Projet"
echo. & echo ==^>^> %chaine%
set string=%chaine%;

call :count 0
set nb=!compteur!
call :count 1

echo. & echo ==^>^> !ligne!

echo. & pause
exit /b 0

:: -------------------------------------------------------
:: fin du programme
:: -------------------------------------------------------


:: -------------------------------------------------------
:: fonction d'analyse et de récupération de chaine
:: -------------------------------------------------------

:count

set /a compteur=position=0

:boucle

set "car=!string:~%position%,1!"
if "!car!"=="\" (set /a compteur+=1)
set /a position+=1

if %1 EQU 0 (if not "!car!"==";" (goto :boucle))
if %1 EQU 1 (if not "!compteur!"=="!nb!" (set "ligne=!ligne!!car!" & goto :boucle))

goto :eof

Ce code est à améliorer car il ne prévoit pas un scénario (= si la chaine se termine par "\"). Je m'en occuperai quand j'aurai le temps.

Maintenant dodo.



“L'intelligence artificielle se définit comme le contraire de la bêtise naturelle.”
Commenter la réponse de barnabe0057