Eu tenho um exe que produz uma saída com algum parâmetro, e a partir dessa saída quero que a parte inteira seja armazenada em um arquivo como abaixo:
C:\MyExe -param
fornece um o/p 123abc
, portanto 123
deve ser armazenado em um arquivo. Como podemos conseguir isso através da linha de comando do Windows?
Responder1
Isso não é tão elegante quanto a resposta de dbenham, mas é puro Windows. Se a saída do seu programa sempre se parecer com o seu exemplo (uma sequência de dígitos imediatamente seguida por uma letra minúscula e seguida por outras coisas), isso funcionará:
for /f "delims=abcdefghijklmnopqrstuvwxyz" %x in ('C:\MyExe -param') do echo %x > out.txt
Notas:
- Se o último dígito puder ser seguido por um caractere diferente de uma letra minúscula (até mesmo um espaço), inclua todos os caracteres delimitadores possíveis na
delims=
string. - O comando acima funcionará se digitado em um prompt de comando interativo. Para usá-lo em um arquivo em lote (ou seja, um script de prompt de comando), altere
%x
para%%x
(ambas as ocorrências). O comando acima executará o
echo %x > out.txt
subcomando uma vez para cada linha de saídaC:\MyExe -param
que contenha pelo menos um caractere delimitador. Se o seu programa escreve apenas aquela linha, não há problema. Se você programar escreve múltiplas dessas linhas, por exemplo,5gold rings 4calling birds 3french hens 2turtle doves 1partridge
ele substituirá o arquivo todas as vezes e você terminará com apenas o último valor. Se você quiser capturar todos os números, adicione parênteses, assim:
(for /f "delims=abc…xyz" %x in ('C:\MyExe -param') do echo %x) > MyOutputFile.txt ↑ ↑
portanto, todo o comando (até
echo %x
) será tratado como um único comando e o redirecionamento (>
) ocorrerá apenas uma vez. Como alternativa, basta alterar>
para>>
e as saídas serão acumuladas (mas também, tudo o que estava no arquivo antes ainda estará lá, com a nova saída anexada a ele).
Responder2
Isso não é trivial com lote puro, mas é se você usarREPL.BAT - um utilitário híbrido JScript/loteque executa uma pesquisa/substituição de expressão regular em stdin e grava o resultado em stdout. É um script puro que será executado em qualquer máquina Windows moderna a partir do XP.
c:\myExe -param | repl "(\d*).*" $1 >out.txt