Como obter o caminho da pasta do caminho do arquivo com o CMD

151

Eu preciso do caminho para a pasta que contém o arquivo cmd. Com% 0, posso obter o nome do arquivo. Mas como obter o nome da pasta?

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

PS Meu diretório atual! = Pasta do script.

Mike Chaliy
fonte

Respostas:

310

Para o nome da pasta e unidade, você pode usar:

echo %~dp0

Você pode obter muito mais informações usando diferentes modificadores:

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

Esta é uma pasta de cópia do "for /?" comando no prompt. Espero que ajude.

Relacionado

As 10 principais dicas de lote do DOS (Sim, lote do DOS ...) mostram batchparams.bat (link para a origem como uma essência):

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
Wadih M.
fonte
Legal. Preciso de uma pontuação específica para modificar a postagem no wiki de outra pessoa?
Wadih M.
@Wadih M .: link geralmente útil stackoverflow.com/questions/18557/…
jfs
@Wadih M .: Em particular stackoverflow.com/questions/130654/…
jfs
@Wadih M .: No link acima: "+750 para editar as postagens da comunidade 'editáveis ​​pelo wiki'"
jfs 18/03/2009
Portanto, se você deseja que um script cmd defina o diretório de trabalho para o local do script: cd /d "%~dp0"(de stackoverflow.com/questions/4451668 )
Nigel Touch
52

A resposta aceita é útil, mas não é imediatamente óbvio como recuperar um nome de arquivo de um caminho se você NÃO estiver usando valores passados. Consegui resolver isso a partir deste tópico, mas, caso outros não tenham a mesma sorte, eis como isso é feito:

@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

Agora, a :file_name_from_pathfunção pode ser usada em qualquer lugar para recuperar o valor, não apenas para argumentos passados. Isso pode ser extremamente útil se os argumentos puderem ser transmitidos para o arquivo em uma ordem indeterminada ou se o caminho não for transmitido para o arquivo.

NightOwl888
fonte
Wow isso é incrível! Portanto, arquivos em lote do Windows suportam a função dentro do mesmo arquivo, que utilidade! Desde quando isso foi possível?
Lucas
2
Eu gosto que você pode passar variáveis ​​por referência (como está) e por valor (cercado por "!" S). Ok, você provavelmente não possui variáveis ​​"locais" e uma pilha de chamadas ... mas ei: afinal, é um script cmd, é um grande passo à frente;) Concordo, particionar coisas dentro de um único arquivo é muito mais útil de cisão-lo em torno de vários arquivos :)
Lucas
1
Eu acho que "goto: eof" deve ser "goto eof" .. sem os dois pontos .. como estava quebrando para mim.
Um Khudairy
2
Consulte também: ss64.com/nt/syntax-args.html - use apenas %~dp1para unidade e caminho.
Andrew
2
@AKhudairy está correto: ss64.com/nt/goto.html Com os dois pontos, o goto pula o endlocal (e qualquer outra coisa que você colocar depois, como uma pausa). Além disso, você precisa adicionar "s em torno de !myPath!se o caminho tiver espaços (ou ter as aspas ser parte de myPath)
Rick
8

Para atribuí-los a variáveis, certifique-se de não adicionar espaços à frente ou depois do sinal de igual:

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

Então você não deve ter problemas.

Frank
fonte
5

Caso alguém queira um método alternativo ...

Se este for o último subdiretório no caminho, você poderá usar esta linha única:

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

Isso retornaria o seguinte:

c:\directory\subdirectory

O .... retorna ao diretório anterior. / ad mostra apenas diretórios / b é uma listagem de formato simples e inclui todos os subdiretórios. Isso é usado para obter o caminho completo do diretório para impressão.

Marca
fonte
Provavelmente funciona no diretório atual, não no diretório em que o arquivo de script está localizado.
Mike Chaliy
4

Eu tive o mesmo problema no meu loop, onde eu queria extrair arquivos zip no mesmo diretório e excluir o arquivo zip. O problema era que o 7z requer a pasta de saída, então tive que obter o caminho da pasta de cada arquivo. Aqui está a minha solução:

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

%% i era o caminho completo do nome do arquivo e% ii \ .. simplesmente retorna a pasta pai.

espero que ajude.

Gico
fonte
Rapido e sujo. Eu gosto disso! Nunca pensei que você estendesse um caminho de arquivo com "\ .." e acabasse com a pasta pai.
Oliver R.
Isso funcionou para mim no Win10: FOR / R "C: \ sourceDir"% I IN (* .gz) DO C: \ 7-Zip64 \ 7z.exe x "% I" - você -o% I \ .. \
233
Sim! Isso contorna o problema de que% ~ dp1 (etc.) funciona apenas em% 0,% 1,% 2 etc.
Artelius 2/19/19
3

Caso a resposta aceita por Wadih não funcione para você, tente echo %CD%

Naguib Ihab
fonte
0

Isso foi montado com algum exemplo editado 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
Steve Seymour
fonte