Pergunta

Eu estou olhando para um arquivo de lote que define as seguintes variáveis:

set _SCRIPT_DRIVE=%~d0
set _SCRIPT_PATH=%~p0
  • O que fazer %~d0 ou %~p0 realmente significa?
  • Existe um conjunto de valores conhecidos para coisas como diretório atual, rígido, parâmetros para um script?
  • Existem outros atalhos semelhantes que eu poderia usar?
Foi útil?

Solução

As variáveis ??mágicas % n contém os argumentos usados ??para invocar o arquivo: %0 é o caminho para o próprio bat-file, %1 é o primeiro argumento após, %2 é o segundo e assim por diante.

Uma vez que os argumentos são muitas vezes caminhos de arquivo, há uma sintaxe adicional para extrair partes do caminho. ~d é rígido, ~p é o caminho (sem unidade), ~n é o nome do arquivo. Eles podem ser combinados de modo ~dp é rígido + caminho.

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

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

aqui para uma referência para todos os comandos de linha de comando. Os códigos de til-magic são descritos sob para .

Outras dicas

Eles são reforçadas substituições de variáveis. Eles modificam as variáveis ??N% usados ??em arquivos em lote. Muito útil se você estiver em programação batch 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 que são dadas abaixo. Em seu comando, ~ d0 significaria a letra da unidade do argumento 0.

~ 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 recebe a letra da unidade do caminho para você. Você pode usar os seguintes atalhos também.

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

Isto pode ser também encontrada diretamente no prompt de comando quando você executar CALL /? ou FOR /?

de Nome do arquivo de análise no arquivo em lotes e mais idiomas - do real How-to :

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

A unidade onde o script é: ~ d0

Outra dica que iria ajudar muito é que para definir o diretório atual para um unidade diferente um teria de uso %~d0 em primeiro lugar, em seguida, cd %~dp0 . Isso irá alterar o diretório para unidade do arquivo de lote, em seguida, mudar para a sua pasta.

Para #oneLinerLovers, cd /d %~dp0 irá mudar tanto a unidade eo diretório:)

Espero que isso ajude alguém.

%~d0 dá-lhe a letra da unidade de argumento 0 (o nome do script), %~p0 o caminho.

Algumas dicas para cuidar de:

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

@echo %0
@pause

Ao clicar duas vezes ele vai 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 de comando, %0 irá se referir a tudo o que você digitado . Se você digitar test.bat Enter , a saída do %0 não terá aspas porque você digitou sem aspas:

c:\>test.bat
test.bat

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

c:\>test
test

Mesmo para tEsT Enter :

c:\>tEsT
tEsT

Se você digitar "test" Enter , a saída do %0 terá aspas (desde que você digitou-los), mas nenhuma extensão:

c:\>"test"
"test"

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

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

Note que estes não são todos os possíveis valores %0 pode 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á %~0, porque a saída de %~0 é simplesmente a saída de citações %0 menos (se houver).

Este código explica o uso do personagem Tilda ~, que foi a coisa mais confuso para mim. Quando entendi 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

Ele exibe a localização atual do arquivo ou pasta que você está atualmente em, por exemplo.; se o seu arquivo de lote foi no diretório desktop, em seguida, "% ~ DP0" iria exibir o diretório desktop. se você queria para exibir o diretório atual com o nome do arquivo atual você pode digitar "% ~ DP0% ~ n0% ~ x0".

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top