Récupérer un nom 8.3 [BATCH]

Bonjour à tous,

je travaille actuellement sur un fichier de commandes et j'aurais besoin de vos lumières.

Voilà à quoi ça ressemble :

[code]
SET cible=C:\Program files\un nom bien (foireux)\dossier1

IF "%cible:~-1%"=="\" (
echo Le chemin %cible% n'est pas correct ! / Veuillez retirer le "\" final
echo cf variable "cible"
pause
GOTO Fin
)

echo Le chemin court est : ..............
echo.
pause
[/code]

Voilà pour le code.

Le problème :

le chemin comporte une parenthèse fermante (foireux ')' qui entraînera une erreur. (\dossier1 était inattendu)

Mon souci est d'arriver à récupérer un nom court au format 8.3 (C:\progra~1\unnomb~1\dossie~1).

J'ai essayé qch comme ca : echo %~sf%cible% mais sans résultat ...

Un petit coup de pouce serait le bienvenu.

Peut être avec un FOR sur la variable %cible% ... ???

Merci d'avance. Cordialement.

7 réponses

  1. Bonjour à tous, j'ai essayer votre petit bout de script qui marche bien sur un pc mais sur un autre le résultat est pour le moment surprenant !

    Voici donc mon script :

    @echo off

    set cible="D:\Echange\1 Projet SCLE\ATLN\Code uC\projet\Hex\binaire.h86"

    for /f %%a in ('echo %cible%') do (
    set toto=%%~fsa
    )

    echo %toto%

    pause

    Le retour :

    D:\Echange\1PROJE~1\ATLN\CODEUC~1\projet\Hex\binaire.h86.h86

    Avez-vous une idée de pourquoi il me rajoute une deuxième fois l'extension du fichier ?

    Merci d'avance

    Benoit
    1
    1. salut ;)

      mettez le entre guillemets =)

      SET cible="C:\Program files\un nom bien (foireux)\dossier1"

      pourquoi :

      car le Ms-Dos ne gere pas les éspaces ainsi que les noms dépaçants 8 caractères

      par exemple dans la commande GOTO elle traite les mots inferieurs ou égal à 8 caractére c-à-d :

      GOTO coucouuua est la meme que GOTO coucouuu
      0
      1. Contributeur
        hello
        pour afficher un nom court
        @echo off  
        set cible="C:\Program files\un nom bien (foireux)\dossier1"  
        for  /f "delims=" %%a in ('echo %cible%') do (  
                echo %%~fsa  
        )  
        
        0
        1. Bonjour,

          l'affichage de ton code est le suivant :

          C:\PROGRA~1\un nom bien (foireux)\dossier1"


          Comme tu le vois le chemin n'est pas complètement court !

          J'ai pensé à extraire chaque chaîne et la traiter séparément mais là encore je n'obtiens pas le nom court comme je le veux ...

          Je mets le code, peut-être que qqu'un peut trouver l'erreur :

          @echo off
          
          :: On renseigne le chemin
          
          SET cible=\\192.168.1.x\un nom (foireux)\Program files\dossier d'install\un autre dossier\repertoire a la noix
          
          :: On extrait chaque "branche" de l'arborescence / Il doit y avoir autant de tokens que de "branches"
          
          FOR /F "tokens=1-6 delims=\" %%a in ("%cible%") do (
          
          IF NOT "%%a"=="" echo %%a>  Extract.txt
          IF NOT "%%b"=="" echo %%b>> Extract.txt
          IF NOT "%%c"=="" echo %%c>> Extract.txt
          IF NOT "%%d"=="" echo %%d>> Extract.txt
          IF NOT "%%e"=="" echo %%e>> Extract.txt
          IF NOT "%%f"=="" echo %%f>> Extract.txt
          
          )
          
          
          setlocal ENABLEdelayedEXPANSION
          
          SET compteur=0
          
          echo.
          
          :: On parcourt le fichier contenant le résultat ligne par ligne
          
          FOR /F "tokens=*" %%A in (extract.txt) do  (
          
          SET /a compteur+=1
          
          echo            La branche !compteur! est : %%A
          
          echo Le nom court est ??? / Test : %%~nsA
          
          echo.
          
          )
          
          pause
          


          N'hésitez pas à proposer des solutions !
          Il existe certainement d'autres manières de le coder ...

          ++
          0
          1. Contributeur
            pour afficher le nom court, il faut que le répertoire un nom bien (foireux) existe
            C:> dir /b/s z 
            C:\Documents and Settings\xxx\Mes documents\src\z\un nom bien (foireux) 
            C:\Documents and Settings\xxx\Mes documents\src\z\un nom bien (foireux)\dossier1 
            C:> bb 
            C:\DOCUME~1\xxx~1\MESDOC~1\src\z\UNNOMB~1\dossier1 
            C:\DOCUME~1\xxx~1\MESDOC~1\src\z\UNNOMB~1\dossier1 
            C:> type bb.bat 
            @echo off 
            
            set cible="C:\Documents and Settings\xxx\Mes documents\src\z\un nom bien (foireux)\dossier1" 
            
            for  /f "delims=" %%a in ('echo %cible%') do ( 
                    echo %%~sa 
                    echo %%~fsa 
            ) 
            C:>
            0
            1. Bonjour dubcek,

              merci pour ta réponse. La cible peut changer, c'est pourquoi j'ai créé une variable ...
              Si le dossier doit exister pour pouvoir générer un nom court, le fichier de commandes génèrera des erreurs.

              J'ai vu que dans PowerBatch il y avait une option pour générer des noms courts mais bien sûr le "convertisseur" n'est pas dans le répertoire d'install, il doit être compilé dans le programme donc impossible d'accéder au code ... :(

              Je cherche une manière de convertir n'importe quel nom de dossier/fichier en son équivalent court !

              Ca a l'air compliqué surtout quand le nom n'est pas unique !

              Explication (Comment Windows transf. les noms longs) :
              https://support.microsoft.com/fr-fr/help/142982

              Le problème est récurrent, lors de l'utilisation d'un nom long avec des caractères non valides dans une boucle FOR ou avec un IF le programme plantera ! (\dossierXYZ était inattendu)

              Le top serait de pouvoir le coder avec des commandes DOS internes uniquement ...

              J'ai essayé bcp de méthodes, avec et sans guillemets, avec 1 et plusieurs tokens,
              le résultat est décevant.

              Certains disent "Te fais pas ch***, code le avec tel langage ou tel autre !"

              Le DOS ça pue un peu c'est sûr, c'est pas très puissant mais il peut faire le boulot ...

              Je pense qu'il est possible de le faire, si c'est possible la solution existe.

              Si quelqu'un a la solution, un bout de code à proposer, je suis preneur !

              Merci d'avance !
              0
              1. un conseil, met toujours des _ à la place des espaces.
                sa evite des problèmes dans le genre :P
                0