Como obter o caminho do script em lote no Windows?

329

Eu sei que %0contém o caminho completo do script em lote, por exemploc:\path\to\my\file\abc.bat

Eu seria pathigual ac:\path\to\my\file

Como eu consegui isso?

Misha Moroshko
fonte
1
BTW:% 0 não contém o caminho completo se o bastão for chamado com uma linha de comando relativa. Portanto, "% ~ dpf0" seria mais confiável para este caso.
Eckes

Respostas:

563

%~dp0será o diretório Aqui está uma documentação sobre todos os modificadores de caminho . Coisas divertidas :-)

Para remover a barra invertida final, você pode usar a :n,msintaxe da substring, da seguinte maneira:

SET mypath=%~dp0
echo %mypath:~0,-1%

Não acredito que haja uma maneira de combinar a %0sintaxe com a :~n,msintaxe, infelizmente.

Dean Harding
fonte
7
Excelente ... estou usando %~0\..- sabia que tinha que haver uma maneira melhor! Além disso, você provavelmente desejará colocar %~dp0aspas duplas ( "") caso haja espaços no nome do diretório etc.
Cameron
1
Agradável ! Mas, %~dp0contém o `` no final. Você tem uma idéia de como removê-lo?
Misha Moroshko
1
@Misha: Eu suponho que você quer dizer como remover o '\' no final. Atualizei minha resposta com detalhes.
Dean Harding
2
O exemplo na resposta funciona bem sem as aspas, mesmo quando há um espaço no caminho. (por exemplo, SET msg=hello worldfunciona bem). No entanto, ao usar% mypath% em outro lugar, você deve tomar cuidado para usá-lo entre aspas, embora eles também não sejam necessários cd.
Martin Pain
2
Esse link agora é 404
StingyJack 9/18/18
12

Você pode usar o script a seguir para obter o caminho sem arrastar "\"

for %%i in ("%~dp0.") do SET "mypath=%%~fi"
duan
fonte
Isso não remove o nome do arquivo do caminho (por exemplo, abc.txt no exemplo do OP).
dcp
4
@ dcp Er, no entanto.
Kyle Strand
@ Kyle Strand - Sim, eu apenas tentei novamente e agora está funcionando bem. Não sei ao certo o que aconteceu quando tentei originalmente, talvez tenha cometido um erro em algum lugar do script. Desculpe pela confusão e obrigado por apontar.
dcp
11

%~dp0pode ser um caminho relativo. Para convertê-lo em um caminho completo, tente algo como isto:

pushd %~dp0
set script_dir=%CD%
popd
Arnaud
fonte
6
Ok, então por que não usar %~dp0diretamente?
jpaugh
5
Uma versão pior da resposta aceita, postada 5 anos depois? Eu não entendo
Kyle Strand
Eu imagino que isso foi publicado para resolver o problema mencionado nos comentários da resposta aceita - %~dp0pode ser relativo, o que pode ou não ser um problema, dependendo do caso de uso
Michael Mrozek
10
%~dp0não pode conter um caminho relativo, dsignifica unidade e pcaminho, como uma unidade pode ser relativa?
jeb
5
Em que mundo? Acabei de testar esta resposta no Windows Server 2012 r2 e, por fim %~dp0, será um caminho absoluto, mesmo quando o script foi executado como um caminho relativo. Graças ao comentário de jeb, não fui enganado por esta resposta. Por que as pessoas inventam coisas e vão começar a espalhar sua imaginação selvagem para outras pessoas? Eu tenho esse colega que faz isso, mas culpei a idade dele (jovem). Eu gostaria que meu voto negativo contasse.
bitoolean
0

Você pode usar %~dp0, d significa apenas a unidade, p significa apenas o caminho, 0 é o argumento para o nome completo do arquivo em lotes.

Por exemplo, se o caminho do arquivo fosse C: \ Users \ Oliver \ Desktop \ example.bat, o argumento seria igual a C: \ Users \ Oliver \ Desktop \, você também poderá usar o comando set cpath=%~dp0 && set cpath=%cpath:~0,-1%e usar o comando%cpath% variável para remover a barra final.

Hayz
fonte
1
Eu não posso ver qualquer mais informações, do que no 9 anos velha resposta
jeb
Informações extras são "d significa apenas a unidade, ..." etc. Obrigado, @Hayz.
RJ Dunnill 6/08/19
-2

%cd% fornecerá o caminho do diretório a partir do qual o script está sendo executado.

Apenas corra:

echo %cd%
Uddalak Biswas
fonte
%CD%é a pasta de trabalho atual, não a pasta em que o arquivo em lotes está armazenado. Eles podem ser o mesmo local, mas geralmente não são.
Stephan
-7

Essa seria a %CD%variável.

@echo off
echo %CD%

%CD% retorna o diretório atual em que o script em lote está.

Ruel
fonte
35
% cd% retorna o diretório do script foi executado a partir, não o diretório do script é no.
Misha Moroshko
4
só funciona se o seu script não modificar o diretório de trabalho. Tente CD C:\Temp <CR> ECHO %CD%( <CR>é newline ...)
Dean Harding
6
Além disso, se você clicar com o botão direito do mouse no script e selecionar "Executar como Administrador", o diretório atual inicial será C: \ Windows \ System32, independentemente de onde o script esteja localizado.
Cameron
Embora não seja uma resposta direta à pergunta do OP, esse tipo de funcionalidade é exatamente o que eu estava procurando quando a encontrei. Obrigado!
Zoltán
Nenhuma das outras soluções postadas parece funcionar para mim no Win7 32bit cmd.exe, pelo menos isso é útil para mim.
Clifford
-8

Estou trabalhando em uma máquina com Windows 7 e acabei usando as linhas abaixo para obter o caminho absoluto da pasta para o meu script bash.

Cheguei a esta solução depois de consultar http://www.linuxjournal.com/content/bash-parameter-expansion .

#Get the full aboslute filename.
filename=$0
#Remove everything after \. An extra \ seems to be necessary to escape something...
folder="${filename%\\*}"
#Echo...
echo $filename
echo $folder
Jonas
fonte
2
O OP está perguntando sobre os scripts de shell BAT / CMD do Windows, não o bash.
rivy