O que faz% ~ média d0 em um arquivo de lote do Windows?
-
02-07-2019 - |
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?
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".