171 votes

Comment obtenir le chemin du dossier à partir du chemin du fichier avec CMD

J'ai besoin du chemin vers le dossier qui contient le fichier cmd. Avec %0 Je peux obtenir le nom du fichier. Mais comment obtenir le nom du dossier ?

c:\temp\test.cmd >> test.cmd

P.S. Mon répertoire courant != dossier du script.

348voto

Wadih M. Points 5161

Pour le nom du dossier et le lecteur, vous pouvez utiliser :

echo %~dp0

Vous pouvez obtenir beaucoup plus d'informations en utilisant différents modificateurs :

%~I         - expands %I removing any surrounding quotes (")
%~fI        - expands %I to a fully qualified path name
%~dI        - expands %I to a drive letter only
%~pI        - expands %I to a path only
%~nI        - expands %I to a file name only
%~xI        - expands %I to a file extension only
%~sI        - expanded path contains short names only
%~aI        - expands %I to file attributes of file
%~tI        - expands %I to date/time of file
%~zI        - expands %I to size of file

The modifiers can be combined to get compound results:
%~dpI       - expands %I to a drive letter and path only
%~nxI       - expands %I to a file name and extension only
%~fsI       - expands %I to a full path name with short names only

Il s'agit d'un copier-coller de la commande "for / ?" de l'invite. J'espère que cela vous aidera.

Related

Les 10 meilleures astuces DOS Batch (Oui, DOS Batch...) montre batchparams.bat (lien vers la source pour l'essentiel) :

C:\Temp>batchparams.bat c:\windows\notepad.exe
%~1     =      c:\windows\notepad.exe
%~f1     =      c:\WINDOWS\NOTEPAD.EXE
%~d1     =      c:
%~p1     =      \WINDOWS\
%~n1     =      NOTEPAD
%~x1     =      .EXE
%~s1     =      c:\WINDOWS\NOTEPAD.EXE
%~a1     =      --a------
%~t1     =      08/25/2005 01:50 AM
%~z1     =      17920
%~$PATHATH:1     =
%~dp1     =      c:\WINDOWS\
%~nx1     =      NOTEPAD.EXE
%~dp$PATH:1     =      c:\WINDOWS\
%~ftza1     =      --a------ 08/25/2005 01:50 AM 17920 c:\WINDOWS\NOTEPAD.EXE

0 votes

Cool. Dois-je avoir un score particulier pour modifier le post wiki de quelqu'un d'autre ?

0 votes

@Wadih M. : Lien généralement utile stackoverflow.com/questions/18557/

0 votes

@Wadih M. : En particulier stackoverflow.com/questions/130654/

61voto

NightOwl888 Points 4622

La réponse acceptée est utile, mais la manière de récupérer un nom de fichier à partir d'un chemin d'accès n'est pas immédiatement évidente si vous n'utilisez PAS de valeurs transmises. J'ai pu résoudre ce problème à partir de ce fil de discussion, mais au cas où d'autres n'auraient pas cette chance, voici comment procéder :

@echo off
setlocal enabledelayedexpansion enableextensions

set myPath=C:\Somewhere\Somewhere\SomeFile.txt
call :file_name_from_path result !myPath!
echo %result%
goto :eof

:file_name_from_path <resultVar> <pathVar>
(
    set "%~1=%~nx2"
    exit /b
)

:eof
endlocal

Maintenant, le :file_name_from_path peut être utilisée n'importe où pour récupérer la valeur, et pas seulement pour les arguments passés. Cela peut être extrêmement utile si les arguments peuvent être passés dans le fichier dans un ordre indéterminé ou si le chemin n'est pas du tout passé dans le fichier.

0 votes

Wow, c'est incroyable ! Les fichiers batch de Windows supportent donc des fonctions à l'intérieur d'un même fichier, comme c'est utile ! Depuis quand est-ce possible ?

0 votes

Je suppose que, techniquement, ce n'est pas une fonction. En fait, c'est un moyen de simuler un appel de fichier batch externe dans le même fichier, ce qui vous permet d'utiliser ces modificateurs si vous n'utilisez pas réellement un appel de fichier batch externe. Je suis tombé sur cette syntaxe quelque part et je l'ai adaptée parce qu'elle regarde plus comme un appel de fonction ordinaire, ce qui rend son utilisation plus intuitive.

2 votes

J'aime que l'on puisse passer des variables à la fois par référence (telle quelle) et par valeur (entourée de " !"s). Ok, vous n'avez probablement pas de variables "locales" et de pile d'appel... mais bon : c'est une cmd script après tout, c'est un grand pas en avant de toute façon ;) Je suis d'accord, cloisonner des trucs à l'intérieur d'un seul fichier est bien plus pratique que de les répartir dans plusieurs fichiers :)

10voto

Frank Points 626

Pour les affecter à des variables, veillez à ne pas ajouter d'espace devant ou après le signe égal :

set filepath=%~dp1
set filename=%~nx1

Alors vous ne devriez pas avoir de problèmes.

7voto

Mark Points 11

Au cas où quelqu'un voudrait une méthode alternative...

S'il s'agit du dernier sous-répertoire du chemin d'accès, vous pouvez utiliser cette ligne unique :

cd "c:\directory\subdirectory\filename.exe\..\.." && dir /ad /b /s

Le résultat serait le suivant :

c:\directory\subdirectory

Le site .... revient au répertoire précédent. /ad ne montre que les répertoires /b est un listing au format nu /s inclut tous les sous-répertoires. Ceci est utilisé pour obtenir le chemin complet du répertoire à imprimer.

0 votes

Cela fonctionne probablement contre le répertoire courant, pas contre un répertoire où se trouve le fichier script.

4voto

Gico Points 162

J'avais le même problème dans ma boucle où je voulais extraire des fichiers zip dans le même répertoire et ensuite supprimer le fichier zip. Le problème était que 7z nécessite le dossier de sortie, donc je devais obtenir le chemin du dossier de chaque fichier. Voici ma solution :

FOR /F "usebackq tokens=1" %%i IN (`DIR /S/B *.zip` ) DO (
  7z.exe x %%i -aoa -o%%i\..
) 

%%i était un chemin complet de nom de fichier et %ii \.. renvoie simplement le dossier parent.

J'espère que cela vous aidera.

0 votes

Rapide et sale. J'aime ça ! Je n'avais jamais pensé que l'on pouvait étendre le chemin d'un fichier avec " \.. "et se retrouver avec le dossier parent.

0 votes

Cela a fonctionné pour moi sur Win10 : FOR /R " C:\sourceDir " %I IN (*.gz) DO C:\7 -Zip64 \7z.exe x "%I" -aou -o%I \..\

0 votes

Oui ! Cela permet de contourner le problème que %~dp1 (etc.) ne fonctionne que sur %0, %1, %2 etc.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X