linha de comando .cmd / script .bat, como obter o diretório de script em execução
-
02-07-2019 - |
Pergunta
Como você pode obter o diretório do script que foi executado e usá-lo dentro do arquivo .cmd?
Solução
Raymond Chen tem algumas ideias:
https://devblogs.microsoft.com/oldnewthing/20050128- 00 /? p = 36573
Citado aqui na íntegra porque arquivos MSDN tendem a ser pouco fiáveis:
A maneira mais fácil é usar a pseudo-variável
%CD%
. Ele se expande para o diretório de trabalho atual.
set OLDDIR=%CD%
.. do stuff ..
chdir /d %OLDDIR% &rem restore current directory
(Claro, diretório save / restore poderia mais facilmente ter sido feito com
pushd
/popd
, mas isso não é o ponto aqui.)O truque
%CD%
é útil até mesmo na linha de comando. Por exemplo, eu muitas vezes encontro-me em um diretório onde há um arquivo que eu quero operar, mas ... oh, eu preciso chdir para algum outro diretório, a fim para realizar essa operação.
set _=%CD%\curfile.txt
cd ... some other directory ...
somecommand args %_% args
(Eu gosto de usar
%_%
como a minha variável de ambiente do zero.)Tipo
SET /?
para ver os outros pseudo-variáveis ??fornecidas pelo comando processador.
Também os comentários no artigo são bem vale a digitalização, por exemplo, um presente (através do Wayback Machine, uma vez que os comentários são ido de artigos mais antigos):
http://blogs.msdn.com/oldnewthing/archive/2005/01/28/362565.aspx#362741
Isto cobre o uso de% ~ DP0:
Se você quer saber onde vive o arquivo de lote:
%~dp0
%0
é o nome do arquivo em lotes.~dp
dá-lhe a unidade e caminho o argumento especificado.
Outras dicas
Este é equivalente ao caminho do script:
%~dp0
Este usa a sintaxe lote extensão parâmetro. Parâmetro 0 é sempre o próprio script.
Se o seu script é armazenado no C:\example\script.bat
, avalia então %~dp0
para C:\example\
.
ss64.com tem mais informações sobre a sintaxe de extensão parâmetro. Aqui está o trecho relevante:
Você pode obter o valor de qualquer parâmetro usando um% seguido por sua posição numérica na linha de comando.
[...]
Quando um parâmetro é usado para fornecer um nome de arquivo, em seguida, a seguinte sintaxe estendida pode ser aplicada:
[...]
% ~ d1 Expandir% 1 apenas para uma letra de unidade - C:
[...]
% ~ p1 Expandir% 1 para somente um caminho por exemplo \ Utils \ esta inclui uma fuga \ o que pode ser interpretado como um caractere de escapar por alguns comandos.
[...]
Os modificadores acima podem ser combinadas:
% ~ dp1 Expandir% 1 para uma letra de unidade e caminho única
[...]
Você pode obter o caminho do script em lotes-se com% 0, as extensões dos parâmetros podem ser aplicados a este modo% ~ DP0 voltará a unidade eo caminho para o script em lotes, por exemplo W: \ scripts \
for /F "eol= delims=~" %%d in ('CD') do set curdir=%%d
pushd %curdir%