Passando argumentos da linha de comando para um script em lote do Windows

10

Preciso criar um script em lote do Windows em que preciso passar alguns argumentos da linha de comando. Esses argumentos podem aparecer em qualquer ordem, mas o script deve buscá-los corretamente com base no nome do argumento. Por exemplo:

<scriptname> -age <agevalue> -gender <gender>
<scriptname> -gender <gender> -age <agevalue>

O script pode ser chamado de qualquer uma das duas maneiras acima, mas a idade e o sexo devem ser adequadamente escolhidos e atribuídos às variáveis. Os argumentos podem ser identificados pelo comutador antes deles - ou seja, -age, -gender, etc.

Alguém pode me dar um exemplo de identificação interna?

Dhiwakar Ravikumar
fonte

Respostas:

10

Infelizmente, o lote não possui uma getopsfunção integrada, como o . No entanto, você pode implementar sua própria variante do pobre homem:

:GETOPTS
 if /I %~1 == --age set AGE=%2& shift
 if /I %~1 == --gender set GENDER=%2& shift
 shift
if not (%1)==() goto GETOPTS
Mureinik
fonte
isso pode ser complicado, pois o número de argumentos excede, mas se encaixa na conta. Graças
Dhiwakar Ravikumar
1
Seguindo robvanderwoude.com/if.php , seria melhor escrever if /I "%~1" == "--age" ... (observe o til). Isso também funciona para parâmetros vazios ou parâmetros que são colocados entre aspas duplas.
Axel Kemper
Você pode adicionar aspas duplas. Caso contrário, a instrução não funcionará com o parâmetro% 1 vazio.
Axel Kemper
Se seus vários argumentos possíveis tiverem um formato ou tipo definido, como idade (sendo numéricos) e sexo (sendo "M" ou "F"), você não precisará definir os argumentos, mas use o reconhecimento de comparação para atribuí-los a as variáveis ​​apropriadas no script. Fiz isso para um script em lote inicial que escrevi durante um período de transição entre 9x e XP no meu primeiro trabalho de TI. O script pode aceitar argumentos para o tipo de sistema operacional, a unidade da qual o script está sendo executado e algumas outras coisas, ou pode detectar automaticamente as configurações apropriadas. Um pouco exagerado, mas um exercício divertido.
music2myear
8

Você pode fazer isso com o Powershell? ou precisa ser em lote? O Powershell torna tudo fácil e agradável, você só precisa adicionar algo assim na parte superior do seu script e, em seguida, pode chamar cada parâmetro em qualquer ordem

param (
[string]$Age,
[string]$Gender
)

Você pode fazer isso com lotes, mas isso exigirá muita verificação de parâmetros. Aqui estão alguns links de alguns scripts em lotes que fazem isso

http://www.ericphelps.com/batch/samples/arguments.bat.txt

(Possível duplicado de)

/programming/5215729/is-there-a-way-to-pass-parameters-by-name-and-not-by-order-to-a-batch-bat-f

mrwhale
fonte
1
ele tem que ser apenas scripts em lotes :( Temos uma obrigação estrita de que se trate de um script em lotes Muito obrigado embora :)..
Dhiwakar Ravikumar