Extraire le chemin d'un nom de fichier complet

Greg -  
barnabe0057 Messages postés 14329 Date d'inscription   Statut Contributeur Dernière intervention   -
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.

3 réponses

  1. barnabe0057 Messages postés 14329 Date d'inscription   Statut Contributeur Dernière intervention   4 930
     
    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


    1
  2. Greg
     
    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.
    0
    1. barnabe0057 Messages postés 14329 Date d'inscription   Statut Contributeur Dernière intervention   4 930
       
      Ok alors il suffit de remplacer %%~dpA par %%~pA
      0
    2. Greg
       
      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 ?
      0
    3. barnabe0057 Messages postés 14329 Date d'inscription   Statut Contributeur Dernière intervention   4 930
       
      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.
      0
    4. Greg
       
      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 ?
      0
  3. barnabe0057 Messages postés 14329 Date d'inscription   Statut Contributeur Dernière intervention   4 930
     
    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.

    0