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

Eu estou olhando para um arquivo de lote que define as seguintes variables:

set _SCRIPT_DRIVE=%~d0 set _SCRIPT_PATH=%~p0 
  • O que %~d0 ou %~p0 realmente significam?
  • 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?

As variables ​​mágicas % n contém os argumentos usados ​​para invocar o arquivo: %0 é o caminho para o arquivo bat em si, %1 é o primeiro argumento depois, %2 é o segundo e assim por diante.

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

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

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

Procure aqui uma referência para todos os comandos da linha de comando. Os códigos de magia de til são descritos abaixo para .

Eles são substituições de variables ​​aprimoradas. Eles modificam as variables% N usadas nos arquivos em lote. Bastante útil se você estiver em 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 /? .

Sim, existem outros atalhos que você pode usar, os quais são fornecidos abaixo. Em 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 0º argumento é 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 o CALL /? ou para /?

A partir da análise do nome de arquivo no arquivo em lote e mais idiomas – Como fazer :

O caminho (sem drive) onde o script é: ~ p0

A unidade em que o script é: ~ d0

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

Para #oneLinerLovers, cd /d %~dp0 mudará a unidade e o diretório 🙂

Espero que isso ajude alguém.

%~d0 fornece a letra de unidade do argumento 0 (o nome do script), %~p0 o caminho.

Algumas pegadinhas a serem observadas:

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

 @echo %0 @pause 

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

 "C:\test.bat" 

Mas se você abrir primeiro um prompt de comando e chamá-lo diretamente desse prompt de comando, %0 se referirá ao que você digitou . Se você digitar test.bat Enter , a saída de %0 não terá aspas porque você não digitou nenhuma aspas:

 c:\>test.bat test.bat 

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

 c:\>test test 

O mesmo para tEsT Enter :

 c:\>tEsT tEsT 

Se você digitar "test" Enter , a saída de %0 terá aspas (desde que você as digitou), mas nenhuma 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" 

Note que estes não são todos os valores possíveis %0 podem 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 as cotações (se houver).

Este código explica o uso do caractere tilda, que foi o mais confuso para mim. Depois que entendi isso, fica muito mais fácil 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 

Ele exibe a localização atual do arquivo ou diretório em que você está atualmente. Por exemplo; Se o arquivo de lote estivesse no diretório da área de trabalho, “% ~ dp0” exibiria o diretório da área de trabalho. se você quisesse exibir o diretório atual com o nome do arquivo atual, você poderia digitar “% ~ dp0% ~ n0% ~ x0”.