O que significa% ~ d0 em um arquivo em lotes do Windows?

354

Estou olhando para um arquivo em lotes que define as seguintes variáveis:

set _SCRIPT_DRIVE=%~d0
set _SCRIPT_PATH=%~p0
  • O que significa %~d0ou %~p0realmente significa?
  • Existe um conjunto de valores conhecidos para coisas como diretório atual, unidade, parâmetros para um script?
  • Existem outros atalhos semelhantes que eu poderia usar?
Chris Smith
fonte

Respostas:

540

As variáveis ​​mágicas %n contêm os argumentos usados ​​para chamar o arquivo: %0é o caminho para o próprio arquivo bat, %1é o primeiro argumento depois, %2é o segundo e assim por diante.

Como os argumentos geralmente são caminhos de arquivo, há alguma sintaxe adicional para extrair partes do caminho. ~dé drive, ~pé o caminho (sem unidade), ~né o nome do arquivo. Eles podem ser combinados, assim ~dpcomo drive + path.

%~dp0 é, portanto, bastante útil em um bastão: é a pasta na qual o arquivo bastão em execução reside.

Você também pode obter outros tipos de informações meta sobre o arquivo: ~té o carimbo de data e hora, ~zé o tamanho.

Procure aqui uma referência para todos os comandos da linha de comandos. Os códigos til-mágicos são descritos em para .

JacquesB
fonte
15
note to self: echo %~dp0não funcionará na linha de comando, apenas em um arquivo em lotes. Duh!
northben 27/03
2
existe uma diferença entre %~d0e %~d0%?
Geoffrey
2
@Pacerier:% 0 é o caminho completo, incluindo o nome do arquivo do script. % ~ dp0 é o caminho para a pasta que contém o script, mas excluindo o nome do arquivo do script.
JacquesB
4
note to self: echo %~pd0fornece a mesma saída que o eco %~dp0(em vez de inverso conforme o esperado). Além disso, o valor de %0é diferente dependendo se você clica duas vezes no arquivo em lotes ou o executa no cmd.
Pacerier 11/08/15
152

Eles são substituições variáveis ​​aprimoradas. Eles modificam as variáveis% N usadas em arquivos em lotes. Bastante útil se você gosta de programação em lote no Windows.

%~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
%~$PATH:I   - searches the directories listed in the PATH
               environment variable and expands %I to the
               fully qualified name of the first one found.
               If the environment variable name is not
               defined or the file is not found by the
               search, then this modifier expands to the
               empty string

Você pode encontrar o acima executando FOR /?.

efotinis
fonte
48

Sim, existem outros atalhos que você pode usar, que são fornecidos abaixo. No seu comando, ~ d0 significaria a letra da unidade do 0º argumento.

~ expands the given variable
d gets the drive letter only
0 is the argument you are referencing

Como o argumento 0 é o caminho do script, ele obtém a letra da unidade do caminho para você. Você também pode usar os seguintes atalhos.

%~1         - expands %1 removing any surrounding quotes (")
%~f1        - expands %1 to a fully qualified path name
%~d1        - expands %1 to a drive letter only
%~p1        - expands %1 to a path only
%~n1        - expands %1 to a file name only
%~x1        - expands %1 to a file extension only
%~s1        - expanded path contains short names only
%~a1        - expands %1 to file attributes
%~t1        - expands %1 to date/time of file
%~z1        - expands %1 to size of file
%~$PATH:1   - searches the directories listed in the PATH
               environment variable and expands %1 to the fully
               qualified name of the first one found.  If the
               environment variable name is not defined or the
               file is not found by the search, then this
               modifier expands to the empty string    

%~dp1       - expands %1 to a drive letter and path only
%~nx1       - expands %1 to a file name and extension only
%~dp$PATH:1 - searches the directories listed in the PATH
               environment variable for %1 and expands to the
               drive letter and path of the first one found.
%~ftza1     - expands %1 to a DIR like output line

Isso também pode ser encontrado diretamente no prompt de comando quando você executa CALL /? ou para /?

Clewaks
fonte
9

Outra dica que ajudaria muito é que, para definir o diretório atual para uma unidade diferente, seria necessário %~d0primeiro cd %~dp0. Isso mudará o diretório para a unidade do arquivo em lotes e, em seguida, para sua pasta.

Para #oneLinerLovers, cd /d %~dp0alterará a unidade e o diretório :)

Espero que isso ajude alguém.

Marvin Thobejane
fonte
7
outra opção é pushd %~dp0, que não tem problema em alterar a unidade atual e oferece o bônus adicional de poder popdvoltar à unidade / caminho original posteriormente.
bcrist
7

%~d0fornece a letra da unidade do argumento 0 (o nome do script), %~p0o caminho.

Armin Ronacher
fonte
6

Algumas dicas a serem observadas:

Se você clicar duas vezes no arquivo em lotes %0, será cercado por aspas. Por exemplo, se você salvar este arquivo como c:\test.bat:

@echo %0
@pause

Clicar duas vezes nele abrirá um novo prompt de comando com a saída:

"C:\test.bat"

Mas se você abrir um prompt de comando e chamá-lo diretamente a partir desse prompt, %0fará referência ao que você digitou . Se você digitar test.batEnter, a saída de %0não terá aspas porque você não digitou aspas:

c:\>test.bat
test.bat

Se você digitar testEnter, a saída de %0também não terá extensão, porque você não digitou nenhuma extensão:

c:\>test
test

Mesmo para tEsTEnter:

c:\>tEsT
tEsT

Se você digitar "test"Enter, a saída de %0terá aspas (desde que você as digitou), mas sem extensão:

c:\>"test"
"test"

Por fim, se você digitar "C:\test.bat", a saída será exatamente como se você tivesse clicado duas vezes:

c:\>"C:\test.bat"
"C:\test.bat"

Observe que esses nem todos os valores possíveis %0podem ser porque você pode chamar o script de outras pastas:

c:\some_folder>/../teST.bAt
/../teST.bAt

Todos os exemplos mostrados acima também afetarão %~0 , porque a saída de %~0é simplesmente a saída de %0 menos aspas (se houver).

Pacerier
fonte
3

Este código explica o uso do caractere ~ tilda, que foi a coisa mais confusa para mim. Depois de entender isso, torna as coisas muito mais fáceis de entender:

@ECHO off
SET "PATH=%~dp0;%PATH%"
ECHO %PATH%
ECHO.
CALL :testargs "these are days" "when the brave endure"
GOTO :pauseit
:testargs
SET ARGS=%~1;%~2;%1;%2
ECHO %ARGS%
ECHO.
exit /B 0
:pauseit
pause
djangofan
fonte
1

Ele exibe a localização atual do arquivo ou diretório em que você está atualmente. Por exemplo; se o arquivo em lote estava no diretório da área de trabalho, "% ~ dp0" exibia o diretório da área de trabalho. se você quiser exibir o diretório atual com o nome do arquivo atual, digite "% ~ dp0% ~ n0% ~ x0".

zask
fonte
"% ~ dpnx0" seria melhor
FrinkTheBrave 26/06