No Windows, como você acessa os argumentos passados quando um arquivo em lotes é executado?
Por exemplo, digamos que eu tenho um programa chamado hello.bat
. Quando entro hello -a
em uma linha de comando do Windows, como faço para informar meu programa que -a
foi passado como argumento?
windows
batch-file
cmd
parameters
arguments
Uma pessoa
fonte
fonte
Respostas:
Como já foi dito, os parâmetros passados pela linha de comando podem ser acessados em arquivos em lotes com a notação
%1
para%9
. Há também outros dois tokens que você pode usar:%0
é o nome do arquivo executável (arquivo em lote), conforme especificado na linha de comando .%*
são todos os parâmetros especificados na linha de comando - isso é muito útil se você deseja encaminhar os parâmetros para outro programa.Também há muitas técnicas importantes a serem observadas, além de simplesmente como acessar os parâmetros.
Verificando se um parâmetro foi passado
Isso é feito com construções como
IF "%~1"==""
, o que é verdadeiro se e somente se nenhum argumento foi passado. Observe o caractere til que faz com que as aspas circundantes sejam removidas do valor de%1
; sem um til, você obterá resultados inesperados se esse valor incluir aspas duplas, incluindo a possibilidade de erros de sintaxe.Lidar com mais de 9 argumentos (ou apenas facilitar a vida)
Se você precisar acessar mais de 9 argumentos que você tem que usar o comando
SHIFT
. Este comando altera os valores de todos os argumentos em um único lugar, de modo que%0
assume o valor de%1
,%1
assume o valor de%2
etc.%9
assume o valor do décimo argumento (se houver algum), que não estava disponível por meio de nenhuma variável antes de chamarSHIFT
(digite comandoSHIFT /?
para mais opções).SHIFT
também é útil quando você deseja processar facilmente parâmetros sem exigir que eles sejam apresentados em uma ordem específica. Por exemplo, um script pode reconhecer os sinalizadores-a
e-b
em qualquer ordem. Uma boa maneira de analisar a linha de comando nesses casos éEsse esquema permite analisar linhas de comando bastante complexas sem enlouquecer.
Substituição de parâmetros de lote
Para parâmetros que representam nomes de arquivos, o shell fornece muitas funcionalidades relacionadas ao trabalho com arquivos que não são acessíveis de nenhuma outra maneira. Essa funcionalidade é acessada com construções que começam com
%~
.Por exemplo, para obter o tamanho do arquivo passado como argumento, use
Para obter o caminho do diretório de onde o arquivo em lotes foi iniciado (muito útil!), Você pode usar
Você pode visualizar toda a gama desses recursos digitando
CALL /?
no prompt de comando.fonte
"name=John"
se tornaráname John
durante exe. A solução é surround com aspas simples,'"name=John"'
CALL /?
? Aqui, eu ando brincando com o Google o tempo todo.Usando parâmetros em arquivos em lote:% 0 e% 9
Os arquivos em lote podem se referir às palavras passadas como parâmetros com os tokens:
%0
to%9
.os parâmetros passados na linha de comando devem ter caracteres alfanuméricos e delimitados por espaços. Como
%0
é o nome do programa como foi chamado, o DOS%0
estará vazio para o AUTOEXEC.BAT se iniciado no momento da inicialização.Exemplo:
Coloque o seguinte comando em um arquivo em lotes chamado
mybatch.bat
:Invocar o arquivo em lotes como este:
mybatch john billy
produziria:Obtenha mais de 9 parâmetros para um arquivo em lotes, use:% *
O símbolo de Porcentagem em estrela
%*
significa "o restante dos parâmetros". Você pode usar um loop for para capturá-los, conforme definido aqui:http://www.robvanderwoude.com/parameters.php
Notas sobre delimitadores para parâmetros em lote
Alguns caracteres nos parâmetros da linha de comando são ignorados pelos arquivos em lotes, dependendo da versão do DOS, sejam "escapados" ou não, e geralmente dependendo da localização na linha de comando:
fonte
Os arquivos em lote passam automaticamente o texto após o programa, desde que sejam variáveis para atribuí-los. Eles são passados na ordem em que são enviados; por exemplo,% 1 será a primeira string enviada após o programa ser chamado, etc.
Se você possui o Hello.bat e o conteúdo é:
e você invoca o lote no comando via
você deve receber esta mensagem de volta:
Olá, APerson241 obrigado por executar este arquivo em lotes (01/11/2013)
fonte
O esquema de Jon
:parse
/:endparse
é um ótimo começo, e ele tem minha gratidão pelo passe inicial, mas se você acha que o sistema de lotes torturantes do Windows deixaria você tão fácil ... bem, meu amigo, você está em choque. Passei o dia inteiro com esse diabo e, depois de muitas pesquisas e experimentações dolorosas, finalmente consegui algo viável para um utilitário da vida real.Digamos que queremos implementar um utilitário
foobar
. Requer um comando inicial. Tem um parâmetro opcional--foo
que aceita um valor opcional (que não pode ser outro parâmetro, é claro); se o valor estiver ausente, o padrão serádefault
. Ele também possui um parâmetro opcional--bar
que aceita um valor necessário . Por fim, pode receber uma bandeira--baz
sem valor permitido. Ah, e esses parâmetros podem vir em qualquer ordem.Em outras palavras, fica assim:
Complicado? Não, isso parece bastante típico dos utilitários da vida real. (
git
alguém?)Sem mais delongas, aqui está uma solução:
Sim, é realmente tão ruim assim. Veja meu post semelhante em https://stackoverflow.com/a/50653047/421049 , onde forneço mais análises do que está acontecendo na lógica e por que usei certas construções.
Medonho. A maioria disso eu tive que aprender hoje. E doeu.
fonte
Use variáveis, ou seja, as
.BAT
variáveis e chamadas%0
para%9
fonte