Apenas convertendo alguns scripts de shell em arquivos em lote e há uma coisa que não consigo encontrar ... e isso é uma simples contagem do número de argumentos de linha de comando.
por exemplo. se você tem:
myapp foo bar
Em Shell:
- $ # -> 2
- $ * -> barra de foo
- $ 0 -> myapp
- $ 1 -> foo
- $ 2 -> bar
Em lote
- ?? -> 2 <---- qual comando ?!
- % * -> barra de foo
- % 0 -> myapp
- % 1 -> foo
- % 2 -> bar
Eu olhei em volta e ou estou procurando no lugar errado ou estou cego, mas não consigo encontrar uma maneira de obter uma contagem do número de argumentos de linha de comando transmitidos.
Existe um comando semelhante ao "$ #" do shell para arquivos em lote?
ps. o mais próximo que descobri é iterar por% 1s e usar 'shift', mas preciso referir-me a% 1,% 2 etc. posteriormente no script, então isso não é bom.
shell
batch-file
scripting
pyko
fonte
fonte
2 myapp foo bar
?Respostas:
Pesquisando um pouco no Google, você obtém o seguinte resultado dos wikibooks :
Parece que o cmd.exe evoluiu um pouco desde os velhos tempos do DOS :)
fonte
for
funciona apenas para argumentos que se parecem com nomes de arquivo, não para strings de opção como-?
. Usar aspas (for %%i in ("%*") ...
) funciona para argumentos semelhantes,-?
mas falha novamente para argumentos entre aspas devido a aspas aninhadas. A única forma robusta parece envolvershift
...MyBatchFile "*.*" "Abc"
relata que argC == 9. - Votos negados.Você tende a lidar com vários argumentos com este tipo de lógica:
etc.
Se você tiver mais de 9 argumentos, então está ferrado com essa abordagem. Existem vários hacks para a criação de contadores que você pode encontrar aqui , mas esteja avisado que eles não são para os medrosos.
fonte
shift
para contar mais de 9 ... e sem ter 10 linhas de código de aparência igual.A função
:getargc
abaixo pode ser o que você está procurando.Basicamente, ele itera uma vez sobre a lista (que é local para a função para que as mudanças não afetem a lista de volta no programa principal), contando-as até que ela se esgote.
Ele também usa um truque bacana, passando o nome da variável de retorno a ser definida pela função.
O programa principal apenas ilustra como chamá-lo e exibe os argumentos depois para garantir que eles não sejam tocados:
fonte
echo Count is %argc%
você deve inserir seu próprio código que pode verificar se a contagem está correta e então seguir em frente.Experimente isto:
fonte
Se o número de argumentos deve ser um número exato (menor ou igual a 9), esta é uma maneira simples de verificar:
fonte
Evita usar um
shift
ou umfor
ciclo à custa do tamanho e da legibilidade.Resultado:
EDITAR: O "truque" usado aqui envolve:
Construindo uma string que representa uma variável de argumento de linha de comando avaliada atualmente (por exemplo, "% 1", "% 2" etc.) usando uma string que contém um caractere de porcentagem (
%%
) e uma variável de contadorarg_idx
em cada iteração do loop.Armazenando essa string em uma variável
curr_arg_label
.Passar aquela string (
!curr_arg_label!
) e o nome de uma variável de retorno (curr_arg_value
) para um subprograma primitivoget_value
.No subprograma, o valor do primeiro argumento (
%1
) é usado no lado esquerdo da atribuição (set
) e o valor do segundo argumento (%2
) à direita. No entanto, quando o argumento do segundo subprograma é passado, ele é resolvido no valor do argumento da linha de comando do programa principal pelo interpretador de comandos. Ou seja, o que é passado não é, por exemplo, "% 4", mas qualquer valor que a quarta variável de argumento da linha de comando contenha ("another_arg" no uso de amostra).Então, a variável fornecida ao subprograma como variável de retorno (
curr_arg_value
) é testada para ser indefinida, o que aconteceria se o argumento da linha de comando avaliado atualmente estivesse ausente. Inicialmente, esta foi uma comparação do valor da variável de retorno entre colchetes e colchetes vazios (que é a única maneira que eu conheço de programas de teste ou argumentos de subprograma que podem conter aspas e foi um resto esquecido da fase de tentativa e erro), mas desde então foi corrigido como é agora.fonte
A última resposta foi há dois anos, mas eu precisava de uma versão para mais de nove argumentos de linha de comando. Pode ser que outro também faça ...
A solução são as primeiras 19 linhas e converte todos os argumentos em variáveis no estilo c. Todas as outras coisas apenas investigam o resultado e mostram a conversão para argumentos locais. Você pode fazer referência a argumentos por índice em qualquer função.
fonte
Uma solução robusta é delegar a contagem a uma sub - rotina chamada com
call
; a sub-rotina usagoto
instruções para emular um loop em queshift
é usado para consumir os argumentos (apenas sub-rotina) iterativamente:fonte