Come ottenere il percorso della cartella dal percorso del file con CMD


151

Ho bisogno del percorso della cartella che contiene il file cmd. Con% 0 posso ottenere il nome del file. Ma come ottenere il nome della cartella?

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

PS La mia directory corrente! = Cartella dello script.

Risposte:


310

Per il nome della cartella e l'unità, è possibile utilizzare:

echo %~dp0

Puoi ottenere molte più informazioni usando diversi modificatori:

%~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

Questa è una copia incolla da "per /?" comando al prompt. Spero che sia d'aiuto.

Relazionato

I 10 migliori suggerimenti batch di DOS (Sì, batch di DOS ...) mostrano batchparams.bat (collegamento all'origine come sintesi):

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

Freddo. Ho bisogno di un punteggio particolare per modificare il post del wiki di qualcun altro?
Wadih M.,

@Wadih M .: In generale utile collegamento stackoverflow.com/questions/18557/...
JFS

@Wadih M .: In particolare stackoverflow.com/questions/130654/…
jfs

@Wadih M .: Dal link sopra: "+750 per modificare i post 'wiki editable' della community"
jfs

Quindi, se si desidera uno script cmd per impostare la directory di lavoro nella posizione dello script: cd /d "%~dp0"(da stackoverflow.com/questions/4451668 )
Nigel Touch

52

La risposta accettata è utile, ma non è immediatamente ovvio come recuperare un nome file da un percorso se NON si utilizzano valori passati. Sono stato in grado di risolverlo da questo thread, ma nel caso in cui altri non siano così fortunati, ecco come è fatto:

@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

Ora la :file_name_from_pathfunzione può essere utilizzata ovunque per recuperare il valore, non solo per argomenti passati. Questo può essere estremamente utile se gli argomenti possono essere passati al file in un ordine indeterminato o se il percorso non è passato affatto nel file.


wow, è fantastico! Quindi i file batch di Windows supportano la funzione all'interno dello stesso file, che utilità! Da quando è stato possibile?
Luca,

2
Mi piace che puoi passare le variabili sia per riferimento (così com'è) che per valore (circondato da "!" S). Ok, probabilmente non hai variabili "locali" e uno stack di chiamate ... ma hey: dopo tutto è uno script cmd, è comunque un grande passo avanti;) Sono d'accordo, partizionare le cose all'interno di un singolo file è molto più utile che dividerlo in diversi file :)
Luca

1
Penso che "goto: eof" dovrebbe essere "goto eof" .. senza i due punti .. come si stava rompendo per me.
A Khudairy,

2
Vedi anche: ss64.com/nt/syntax-args.html - utilizzare solo %~dp1per unità e percorso.
Andrew,

2
@AKhudairy è corretto: ss64.com/nt/goto.html Con i due punti il ​​goto salta l'endlocal (e qualsiasi altra cosa che metti dopo, come una pausa). Inoltre, devi aggiungere "s in giro !myPath!se il tuo percorso contiene spazi (o se le virgolette fanno parte di myPath)
Rick,

8

Per assegnarli alle variabili, assicurati di non aggiungere spazi davanti o dopo il segno di uguale:

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

Quindi non dovresti avere problemi.


5

Nel caso qualcuno voglia un metodo alternativo ...

Se è l'ultima sottodirectory nel percorso, è possibile utilizzare questo one-liner:

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

Ciò restituirebbe quanto segue:

c:\directory\subdirectory

.... torna alla directory precedente. / annuncio mostra solo le directory / b è un elenco in formato nudo che include tutte le sottodirectory. Viene utilizzato per ottenere il percorso completo della directory da stampare.


Probabilmente funziona contro la directory corrente, non una directory in cui si trova il file di script.
Mike Chaliy,

4

Ho avuto lo stesso problema nel mio ciclo in cui volevo estrarre i file zip nella stessa directory e quindi eliminare il file zip. Il problema era che 7z richiede la cartella di output, quindi ho dovuto ottenere il percorso della cartella di ciascun file. Ecco la mia soluzione:

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

%% ero un percorso completo del nome file e% ii \ .. restituisce semplicemente la cartella principale.

spero che sia d'aiuto.


Veloce e sporco. Mi piace! Non avrei mai pensato di estendere a freddo un percorso di file con "\ .." e di finire con la cartella principale.
Oliver R.

Questo ha funzionato per me su Win10: FOR / R "C: \ sourceDir"% I IN (* .gz) DO C: \ 7-Zip64 \ 7z.exe x "% I" -aou -o% I \ .. \
b3wii,

Sì! Ciò aggira il problema che% ~ dp1 (ecc.) Funziona solo su% 0,% 1,% 2 ecc.
Artelius

3

Nel caso in cui la risposta accettata da Wadih non abbia funzionato per te, prova echo %CD%


0

Questo è stato messo insieme con alcuni esempi di cmd modificati

@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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.