web-dev-qa-db-fra.com

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

J'ai besoin du chemin d'accès au 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 actuel! = Dossier du script.

141
Mike Chaliy

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

Ceci est un copier/coller du "pour /?" commande sur l'invite. J'espère que ça aide.

Apparenté, relié, connexe

Top 10 des conseils de lot DOS (Oui, lot DOS ...) indique batchparams.bat (lien vers la source sous forme de Gist):

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
295
Wadih M.

La réponse acceptée est utile, mais il n’est pas évident de savoir comment récupérer un nom de fichier à partir d’un chemin si vous n’utilisez PAS les valeurs transmises. J'ai pu résoudre ce problème à partir de ce fil, 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, la fonction :file_name_from_path peut être utilisée n'importe où pour récupérer la valeur, pas seulement pour les arguments passés. Cela peut être extrêmement utile si les arguments peuvent être passés au fichier dans un ordre indéterminé ou si le chemin n’est pas du tout passé dans le fichier.

46
NightOwl888

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

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

Ensuite, vous ne devriez avoir aucun problème.

7
Frank

Si la réponse acceptée par Wadih ne fonctionne pas pour vous, essayez echo %CD%

2
Naguib Ihab

J'ai eu le même problème dans ma boucle où je voulais extraire des fichiers Zip dans le même répertoire, puis supprimer le fichier Zip. Le problème était que 7z nécessite le dossier de sortie, je devais donc 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 de fichier complet et% ii\.. renvoie simplement le dossier parent.

j'espère que ça aide.

2
Gico

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

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

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

Cela retournerait ce qui suit:

c:\directory\subdirectory

Le .... revient au répertoire précédent./ad affiche uniquement les répertoires/b est une liste nue de format/s inclut tous les sous-répertoires. Ceci est utilisé pour obtenir le chemin complet du répertoire à imprimer.

2
Mark

Cela a été mis en place avec un exemple édité cmd

@Echo off

Echo ********************************************************
Echo *  Zip Folder Backup using 7Zip                        *
Echo *  Usage: Source Folder, Destination Drive Letter      *
Echo *  Source Folder will be Zipped to Destination\Backups *
Echo ********************************************************
Echo off

set year=%date:~-4,4%
set month=%date:~-10,2%
set day=%date:~-7,2%
set hour=%time:~-11,2%
set hour=%hour: =0%
set min=%time:~-8,2%

SET /P src=Source Folder to Backup: 
SET source=%src%\*
call :file_name_from_path nam %src%
SET /P destination=Backup Drive Letter:
set zipfilename=%nam%.%year%.%month%.%day%.%hour%%min%.Zip
set dest="%destination%:\Backups\%zipfilename%"


set AppExePath="%ProgramFiles(x86)%\7-Zip\7z.exe"
if not exist %AppExePath% set AppExePath="%ProgramFiles%\7-Zip\7z.exe"

if not exist %AppExePath% goto notInstalled

echo Backing up %source% to %dest%

%AppExePath% a -r -tzip %dest% %source%

echo %source% backed up to %dest% is complete!

TIMEOUT 5

exit;

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


:notInstalled

echo Can not find 7-Zip, please install it from:
echo  http://7-Zip.org/

:end
PAUSE
0
Steve Seymour