Qual é a melhor maneira de fazer uma substring em um arquivo em lotes?

Eu quero obter o nome do arquivo em lotes atualmente em execução sem a extensão do arquivo.

Graças a este link , eu tenho o nome do arquivo com a extensão … mas qual é a melhor maneira de fazer uma substring em um arquivo de lote?

Ou existe outra maneira de obter o nome do arquivo sem a extensão?

É seguro assumir extensões de 3 letras neste cenário.

Bem, apenas para obter o nome do arquivo do seu lote, a maneira mais fácil seria usar %~n0 .

 @echo %~n0 

irá produzir o nome (sem a extensão) do arquivo em lote atualmente em execução (a menos que seja executado em uma sub-rotina chamada por call ). A lista completa de tais substituições “especiais” para nomes de caminhos pode ser encontrada com help for , no final da ajuda:

Além disso, a substituição de referências de variables ​​FOR foi aprimorada. Agora você pode usar a seguinte syntax opcional:

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

Os modificadores podem ser combinados para obter resultados compostos:

 %~dpI - expands %I to a drive letter and path only %~nxI - expands %I to a file name and extension only %~fsI - expands %I to a full path name with short names only 

Para responder precisamente à sua pergunta, no entanto: Substrings são feitas usando :~start,length notação de :~start,length :

 %var:~10,5% 

irá extrair 5 caracteres da posição 10 na variável de ambiente %var% .

NOTA: O índice das strings é baseado em zero, então o primeiro caractere está na posição 0, o segundo em 1, etc.

Para obter substrings de variables ​​de argumento, como %0 , %1 , etc., você precisa atribuí-las a uma variável de ambiente normal usando set first:

 :: Does not work: @echo %1:~10,5 :: Assign argument to local variable first: set var=%1 @echo %var:~10,5% 

A syntax é ainda mais poderosa:

  • %var:~-7% extrai os últimos 7 caracteres de %var%
  • %var:~0,-4% extrairia todos os caracteres, exceto os quatro últimos, o que também livraria você da extensão do arquivo (assumindo três caracteres após o período [ . ]).

Veja o help set para detalhes sobre essa syntax.

Bem explicado acima!

Para todos aqueles que podem sofrer como eu, para obter este trabalho em um Windows localizado (o meu é o XP em eslovaco), você pode tentar replace o % com um !

Assim:

 SET TEXT=Hello World SET SUBSTRING=!TEXT:~3,5! ECHO !SUBSTRING! 

Como uma informação adicional à resposta de Joey, que não é descrita na ajuda de set /? nem for /? .

%~0 expande para o nome do próprio lote, exatamente como foi typescript.
Então, se você iniciar seu lote, ele será expandido

 %~0 - mYbAtCh %~n0 - mybatch %~nx0 - mybatch.bat 

Mas há uma exceção, expandir em uma sub-rotina pode falhar

 echo main- %~0 call :myFunction exit /b :myFunction echo func - %~0 echo func - %~n0 exit /b 

Isso resulta

 main - myBatch Func - :myFunction func - mybatch 

Em uma function, %~0 expande-se sempre para o nome da function, não do arquivo de lote.
Mas se você usar pelo menos um modificador, ele mostrará o nome do arquivo novamente!