É possível usar uma variável para representar múltiplos parâmetros de um programa na linha de comando do Windows?

5

No meu arquivo de lote, tenho muitas chamadas do mesmo programa com os mesmos parâmetros:

program.exe file1.txt -parameter1 -parameter2 -parameter3 -parameter4 >> output.log
program.exe file2.txt -parameter1 -parameter2 -parameter3 -parameter4 >> output.log
...

Posso declarar uma variável que conterá a string "-parameter1 -parameter2 -parameter3 -parameter4 > > output.log" e usá-la assim:

Set variable=-parameter1 -parameter2 -parameter3 -parameter4 >> output.log 
program.exe file2.txt %variable%

Eu tentei fazer isso, mas não funciona. Se for possível, qual é a sintaxe correta?

    
por Eugene Maksimov 10.12.2013 / 08:11

3 respostas

3

No comando SET, você terá que escapar de cada > assine com um ^. Isso impede que o comando SET interprete o > > como redirecionamento da saída.

Então:

Set variable=-parameter1 -parameter2 -parameter3 -parameter4 ^>^> output.log
program.exe file2.txt %variable%

A resposta do Lemur é a versão correta se você for chamar subshells (com CMD / C), mas para chamadas diretas isso não é necessário.

    
por 10.12.2013 / 13:50
4

Comecei a responder essa pergunta para dizer "Desculpe, mas não". Para minha surpresa, você pode! Não é muito bonito ou eficiente, mas você pode fazer isso.

Armazenar os argumentos normais para program.exe em uma variável é simples. Isso funciona (que é apenas o seu exemplo, sem redirecionamento):

SET MYARGS=-parameter1 -parameter2 -parameter3
program.exe file1.txt %MYARGS%

O redirecionamento, no entanto, não é tratado como argumentos para o programa, mas como diretivas para o shell. Isso acontece antes da configuração ou expansão da variável, portanto, incluir o sufixo >> output.log grava a saída no arquivo de log imediatamente.

Para que isso funcione, você precisa escapar da string de comando e iniciar um novo processo para cada chamada do seu programa.

SET MYARGS=-parameter1 -parameter2 -parameter3 -parameter4 ^^^>^^^> output.log
CMD.EXE /C program.exe file1.txt %MYARGS%
CMD.EXE /C program.exe file2.txt %MYARGS%

É claro que, se o nome ou a localização do seu arquivo de registro precisar ser alterado, isso ficará um pouco mais limpo:

SET LOGFILE=output.log
SET TOLOG=^^^>^^^> %LOGFILE%
SET MYCMD=-parameter1 -parameter2 -parameter3 -parameter4
CMD.EXE /C program.exe file1.txt %MYARGS% %TOLOG%
CMD.EXE /C program.exe file2.txt %MYARGS% %TOLOG%

Girar um intérprete de comando inteiro para cada chamada é um pouco pesado, mas talvez isso seja bom para sua situação. Se você tentar, eu estaria interessado em ver como isso afeta seus tempos de execução.

NOTA : Este truque tem pelo menos uma outra armadilha possível. As variáveis definidas no arquivo de lote não estarão disponíveis nas conchas CMD que você invocar. Você pode forçá-los a ser, mas isso é mais código e não parece necessário para o que você está fazendo.

Consulte Recursos ocultos dos arquivos em lote do Windows para obter o truque de escape ^ e muito mais.

    
por 10.12.2013 / 09:52
1

Is it possible to use a variable to represent multiple parameters of a program in the Windows command line?

Sim, definitivamente

Can I declare a variable which will contain the string:
    -parameter1 -parameter2 -parameter3 -parameter4 >> output.log

and use it like this:
    set variable=-parameter1 -parameter2 -parameter3 -parameter4 >> output.log
    program.exe file2.txt %variable%

Sim, você pode definitivamente fazer isso, mas como já mencionado, você precisa escapar dos caracteres de redirecionamento.

Você não especificou se deve definir a variável no arquivo em lote. Se não, então você pode usar o diálogo regular Variável de Ambiente para definir a variável (como visto abaixo).

Se você deve definir a variável no arquivo batch, então você pode escapar como outros apontaram, mas isso tende a ser pesado devido à sintaxe. Em vez disso, você pode simplesmente citar a chamada para set :

…
set "variable=-parameter1 -parameter2 -parameter3 -parameter4 >> output.log"
program.exe file2.txt %variable%
…

    
por 20.12.2013 / 19:51