Preciso passar um ID e uma senha para um arquivo em lotes no momento da execução, em vez de codificá-los no arquivo.
Aqui está a aparência da linha de comando:
test.cmd admin P@55w0rd > test-log.txt
batch-file
arguments
Keng
fonte
fonte
Respostas:
Outra dica útil é usar
%*
para significar "todos". Por exemplo:Quando você executa:
o arquivo em lotes acima será executado:
Posso ter a sintaxe um pouco errada, mas essa é a ideia geral.
fonte
shift
"aparece" o argumento da lista. A suposição do OP era que%*
apenas produziria os argumentos restantes, mas não funciona dessa maneira, como @Joey disse.fake-command /u admin /p password admin password foo bar
. Isso foi apontado por @Joey há muitos anos.Aqui está como eu fiz isso:
Aqui está a aparência do comando:
O
%1
aplica-se ao primeiro parâmetro a%2
(e aqui está a parte complicada) aplica-se ao segundo. Você pode ter até 9 parâmetros passados dessa maneira.fonte
echo %1 %2
e foi desencorajada pelo caso mais simples, sem cortes e pastáveis, com a@
e afake-command
com parâmetros, pensando que obteríamosfake-command.bat
o conteúdo mais tarde (nesse caso, o overcomplicatedfake-command.bat
pode terecho %2 %4
que ignorar os nomes dos parâmetros). Errado, idiota. TL; DR: Não seja tão burro quanto eu. 1.echo echo %1 %2 > test.bat
2test word1 word2
. 3. Lucro.Se você deseja manipular de forma inteligente os parâmetros ausentes, pode fazer algo como:
fonte
O acesso a parâmetros em lote pode ser simples com% 1,% 2, ...% 9 ou também% *,
mas apenas se o conteúdo for simples.
Não existe uma maneira simples para conteúdos complexos
"&"^&
, como não é possível acessar% 1 sem produzir um erro.As linhas se expandem para
E cada linha falha, pois uma delas
&
está fora das aspas.Isso pode ser resolvido com a leitura de um arquivo temporário de uma versão comentada do parâmetro.
O truque é habilitar
echo on
e expandir o% 1 após umarem
declaração (funciona também com%2 .. %*
).Assim, mesmo
"&"&
pode ser repetido sem produzir um erro, como é observado.Mas para poder redirecionar a saída do
echo on
, você precisa dos dois for-loops.Os caracteres extras
* #
são usados para proteger contra conteúdos como/?
(mostraria a ajuda paraREM
).Ou um sinal de intercalação ^ no final da linha pode funcionar como um caractere multilinha, mesmo depois de a
rem
.Em seguida, leia o parâmetro rem do arquivo, mas com cuidado.
O FOR / F deve funcionar com a expansão atrasada, caso contrário, o conteúdo com "!" seria destruído.
Depois de remover os caracteres extras
param1
, você conseguiu.E para usar de
param1
maneira segura, habilite a expansão atrasada.fonte
&
, sua solução funciona apenas com conteúdo simplestest.bat ^&
e falha. Sótest.bat "&"
funciona, mas esse não era o meu ponto. Você não pode usar%*
, de%1
forma segura, sem a técnica REM&
e comercial e também aspas"
Sim, e simplesmente não se esqueça de usar variáveis como
%%1
ao usarif
andfor
e the gang.Se você esquecer o duplo
%
, substituirá os argumentos da linha de comando (possivelmente nulos) e receberá algumas mensagens de erro bastante confusas.fonte
if
efor
?for %%d in (*) do echo %%d
da linha de comando:for %d in (*) do echo %d
@for %%2 in (testing) do @echo %%2 %1
em um arquivo em lotes, produztesting 1
quando é chamado com 1 (test 1
).%%1
não acessa um argumento de linha de comando e também está errado para oIF
comando. Somente oFOR
comando (em arquivos em lote) requer porcentagens duplas, mas mesmo assim%%1
definiria um parâmetro FOR e não acessa argumentosNão há necessidade de complicar. É simplesmente o comando% 1% 2 parâmetros, por exemplo,
A "pausa" exibe o que o arquivo em lotes fez e espera que você pressione a tecla QUALQUER. Salve isso como xx.bat na pasta do Windows.
Para usá-lo, digite, por exemplo:
Este arquivo em lote cuida de todos os parâmetros necessários, como copiar apenas arquivos mais recentes, etc. Eu o usei desde antes do Windows. Se você gosta de ver os nomes dos arquivos, conforme eles estão sendo copiados, deixe de fora o
Q
parâmetrofonte
Um amigo estava me perguntando sobre esse assunto recentemente, então pensei em postar como lidar com argumentos de linha de comando em arquivos em lotes.
Essa técnica tem um pouco de sobrecarga, como você verá, mas torna meus arquivos em lote muito fáceis de entender e rápidos de implementar. Além de apoiar as seguintes estruturas:
O jist é ter o
:init
,:parse
, e:main
funções.fonte
Nota: SE
"%1"==""
causará problemas se%1
estiver entre aspas.Nesse caso, use
IF [%1]==[]
ou, apenas no NT 4 (SP6) e posterior, emIF "%~1"==""
vez disso.fonte
Vamos manter isso simples.
Aqui está o arquivo .cmd.
Aqui estão três chamadas da linha de comando.
fonte
Isso faz um loop nos parâmetros do lote (% *), sejam eles citados ou não, e então ecoa cada parâmetro.
fonte
test.bat *.txt
,test.bat cat^&dog
ouTest.bat /?
Eu escrevi um script read_params simples que pode ser chamado como uma função (ou externa
.bat
) e colocará todas as variáveis no ambiente atual. Não modificará os parâmetros originais porque a função está sendocall
editada com uma cópia dos parâmetros originais.Por exemplo, dado o seguinte comando:
myscript.bat
seria capaz de usar as variáveis depois de chamar a função:Aqui está a função:
Limitações
-force
. Você poderia usar,-force=true
mas não consigo pensar em uma maneira de permitir valores em branco sem conhecer uma lista de parâmetros antecipadamente que não terão um valor.Changelog
-
antes de parâmetros.fonte
No arquivo em lote
E na linha de comando, passe o argumento
A saída será
fonte
Para se referir a uma variável definida na linha de comando, você precisaria usá-
%a%
lo, por exemplo:Nota: Isso funciona para o Windows 7 pro.
fonte
Inspirado por uma resposta em outro lugar do @Jon, criei um algoritmo mais geral para extrair parâmetros nomeados, valores opcionais e comutadores.
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 levar uma bandeira--baz
sem nenhum valor permitido. Ah, e esses parâmetros podem vir em qualquer ordem.Em outras palavras, fica assim:
Aqui está uma solução:
SETLOCAL
para que as variáveis não escapem para o ambiente de chamada.SET FOO=
, etc., caso alguém as defina no ambiente de chamada.%~1
para remover aspas.IF "%ARG%" == ""
e nãoIF [%ARG%] == []
porque[
e]
não brinque com valores que terminam em um espaço.SHIFT
dentro de umIF
bloco, os argumentos atuais como%~1
não são atualizados porque são determinados quando oIF
item é analisado. Você poderia usar%~1
e%~2
dentro doIF
bloco, mas seria confuso porque você tinha umSHIFT
. Você pode colocar oSHIFT
final do bloco para maior clareza, mas isso pode se perder e / ou confundir as pessoas também. Portanto, "capturar"%~1
e%~1
fora do quarteirão parece melhor.IF NOT "%ARG:~0,2%" == "--"
.SHIFT
quando você usa um dos parâmetros.SET FOO=%DEFAULT_FOO%
é lamentável, mas a alternativa seria adicionar umIF "%FOO%" == "" SET FOO=%DEFAULT_FOO%
fora doIF NOT "%ARG%" == ""
bloco. No entanto, porque isso ainda está dentro doIF "%PARAM%" == "--foo"
bloco, o%FOO%
valor teria sido avaliado e ajustado antes que você nunca entrou no bloco, de modo que você nunca iria detectar que tanto o--foo
parâmetro estava presente e também que o%FOO%
valor estava faltando.ECHO Missing bar value. 1>&2
envia a mensagem de erro para stderr.ECHO:
ou uma das variações.fonte
Crie um novo arquivo em lote (exemplo: openclass.bat) e escreva esta linha no arquivo:
Em seguida, coloque o arquivo em lotes, digamos, na pasta system32, vá para o arquivo de classe Java, clique com o botão direito do mouse em Propriedades, Abrir com ..., encontre o arquivo em lote, selecione-o e é isso ...
Funciona para mim.
PS: Não consigo encontrar uma maneira de fechar a janela do cmd quando fecho a classe Java. Por enquanto...
fonte
start /wait java %~n1
Solução simples (embora a pergunta seja antiga)
Test1.bat
CallTest1.bat
resultado
Onde YourLocalPath é o caminho do diretório atual.
Para simplificar, armazene o comando param na variável e use a variável para comparação.
Não é apenas simples de escrever, mas também simples de manter; portanto, se mais tarde alguém ou você ler seu script após um longo período de tempo, será fácil entender e manter.
Para escrever código embutido: veja outras respostas.
fonte
Obs: Para uso sem:
?*&<>
fonte
?*&<>