Um arquivo em lote do Windows pode determinar seu próprio nome de arquivo?
Por exemplo, se eu executar o arquivo em lote C: \ Temp \ myScript.bat, há um comando em myScript.bat que pode determinar a string "myScript.bat"?
Um arquivo em lote do Windows pode determinar seu próprio nome de arquivo?
Por exemplo, se eu executar o arquivo em lote C: \ Temp \ myScript.bat, há um comando em myScript.bat que pode determinar a string "myScript.bat"?
Respostas:
Sim.
Use a %0
variável especial para obter o caminho para o arquivo atual.
Escreva %~n0
para obter apenas o nome do arquivo sem a extensão.
Escreva %~n0%~x0
para obter o nome do arquivo e a extensão.
Também é possível escrever %~nx0
para obter o nome do arquivo e a extensão.
cd
entrar no diretório primeiro e executar o lote de lá,% 0 normalmente não terá as informações do caminho (mas você poderia obtê-las em% cd% nesse caso)
%cd%
retornará o Diretório Atual do processo que chamou o arquivo em lote. Portanto, se você estiver em um prompt D:\dir1
e entrar Y:\foo\bar.bat
, se bar.bat
tiver @echo %cd%
, ele será enviado D:\dir1
.
Você pode obter o nome do arquivo, mas também pode obter o caminho completo, dependendo do que você colocar entre '% ~' e '0'. Escolha entre
d -- drive
p -- path
n -- file name
x -- extension
f -- full path
Por exemplo, de dentro de c: \ tmp \ foo.bat, %~nx0
fornece "foo.bat", enquanto %~dpnx0
fornece "c: \ tmp \ foo.bat". Observe que as peças são sempre montadas em ordem canônica, então, se você for engraçado e tentar %~xnpd0
, ainda obterá "c: \ tmp \ foo.bat"
f
é o nome do arquivo, mas em seus exemplos você usa n
para o nome do arquivo. Após alguns testes, parece que f
é o caminho completo e n
é o nome do arquivo.
%~xnpd0
" ... eu te amo.
Usando o seguinte script, com base na resposta do SLaks, determinei que a resposta correta é:
echo The name of this file is: %~n0%~x0
echo The name of this file is: %~nx0
E aqui está meu script de teste:
@echo off
echo %0
echo %~0
echo %n0
echo %x0
echo %~n0
echo %dp0
echo %~dp0
pause
O que acho interessante é que % nx0 não funcionará, visto que sabemos que o caractere '~' geralmente é usado para retirar / cortar aspas de uma variável.
Lembre-se de que 0
é um caso especial de números de parâmetros dentro de um arquivo em lote, onde 0
significa que esse arquivo é fornecido na linha de comando .
Portanto, se o arquivo for meuarquivo.bat, você pode chamá-lo de várias maneiras da seguinte maneira, cada uma das quais forneceria uma saída diferente do uso %0
ou %~0
:
myfile
myfile.bat
mydir\myfile.bat
c:\mydir\myfile.bat
"c:\mydir\myfile.bat"
Todas as opções acima são chamadas legais se você chamá-lo do local relativo correto para o diretório no qual ele existe. %~0
remove as aspas do último exemplo, enquanto%0
mas não.
Porque todos eles fornecem resultados diferentes, %0
e %~0
é muito improvável que sejam o que você realmente deseja usar.
Aqui está um arquivo em lote para ilustrar:
@echo Full path and filename: %~f0
@echo Drive: %~d0
@echo Path: %~p0
@echo Drive and path: %~dp0
@echo Filename without extension: %~n0
@echo Filename with extension: %~nx0
@echo Extension: %~x0
@echo Filename as given on command line: %0
@echo Filename as given on command line minus quotes: %~0
@REM Build from parts
@SETLOCAL
@SET drv=%~d0
@SET pth=%~p0
@SET fpath=%~dp0
@SET fname=%~n0
@SET ext=%~x0
@echo Simply Constructed name: %fpath%%fname%%ext%
@echo Fully Constructed name: %drv%%pth%%fname%%ext%
@ENDLOCAL
pause
Tente executar o exemplo abaixo para sentir como as variáveis mágicas funcionam.
@echo off
SETLOCAL EnableDelayedExpansion
echo Full path and filename: %~f0
echo Drive: %~d0
echo Path: %~p0
echo Drive and path: %~dp0
echo Filename without extension: %~n0
echo Filename with extension: %~nx0
echo Extension: %~x0
echo date time : %~t0
echo file size: %~z0
ENDLOCAL
As regras relacionadas estão a seguir.
%~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
@echo off
Set z=%%
echo.
echo %z%0.......%0
echo %z%~0......%~0
echo %z%n0......%n0
echo %z%x0......%x0
echo %z%~n0.....%~n0
echo %z%dp0.....%dp0
echo %z%~dp0....%~dp0
echo.
Percebi que o nome do arquivo fornecido por% ~ 0 e% 0 é a forma como foi inserido no shell de comando e não como o arquivo é realmente nomeado. Portanto, se você quiser que o caso literal seja usado para o nome do arquivo, você deve usar% ~ n0. No entanto, isso deixará de fora a extensão do arquivo. Mas se você souber o nome do arquivo, poderá adicionar o código a seguir.
set b=%~0
echo %~n0%b:~8,4%
Eu aprendi que ": ~ 8,4%" significa começar no 9º caractere da variável e então mostrar os próximos 4 caracteres. O intervalo é de 0 até o final da string variável. Portanto,% Path% seria muito longo!
fIlEnAmE.bat
012345678901
No entanto, isso não é tão sólido quanto a solução de Jool (% ~ x0) acima.
C:\bin>filename.bat
%0.......filename.bat
%~0......filename.bat
. . .
C:\bin>fIlEnAmE.bat
%0.......fIlEnAmE.bat
%~0......fIlEnAmE.bat
%n0......n0
%x0......x0
%~n0.....FileName
%dp0.....dp0
%~dp0....C:\bin\
%~n0%b:~8,4%...FileName.bat
Press any key to continue . . .
C:\bin>dir
Volume in drive C has no label.
Volume Serial Number is CE18-5BD0
Directory of C:\bin
. . .
05/02/2018 11:22 PM 208 FileName.bat
@echo off
Set z=%%
set b=%~0
echo.
echo %z%0.......%0
echo %z%~0......%~0
echo %z%n0......%n0
echo %z%x0......%x0
echo %z%~n0.....%~n0
echo %z%dp0.....%dp0
echo %z%~dp0....%~dp0
echo.
echo A complex solution:
echo ===================================
echo %z%~n0%z%b:~8,4%z%...%~n0%b:~8,4%
echo ===================================
echo.
echo The preferred solution:
echo ===================================
echo %z%~n0%z%~x0.......%~n0%~x0
echo ===================================
pause
%0
é o que você está procurando. Veja [esta questão] [1] para mais. [1]: stackoverflow.com/questions/357315/…