Tengo un archivo ejecutable que produce una salida con algún parámetro, y de esa salida quiero que la parte entera se almacene en un archivo como el siguiente:
C:\MyExe -param
da un o/p 123abc
, por lo que 123
debe almacenarse en un archivo. ¿Cómo podemos lograr esto a través de la línea de comandos de Windows?
Respuesta1
Esto no es tan elegante como la respuesta de dbenham, pero es puro Windows. Si la salida de su programa siempre se parece a su ejemplo (una secuencia de dígitos seguida inmediatamente por una letra minúscula y luego seguida por otras cosas), esto funcionará:
for /f "delims=abcdefghijklmnopqrstuvwxyz" %x in ('C:\MyExe -param') do echo %x > out.txt
Notas:
- Si el último dígito puede ir seguido de un carácter que no sea una letra minúscula (incluso un espacio), incluya todos los caracteres delimitadores posibles en la
delims=
cadena. - El comando anterior funcionará si se escribe en un símbolo del sistema interactivo. Para usarlo en un archivo por lotes (es decir, una secuencia de comandos del símbolo del sistema), cambie
%x
a%%x
(ambas apariciones). El comando anterior ejecutará el
echo %x > out.txt
subcomando una vez por cada línea de salidaC:\MyExe -param
que contenga al menos un carácter delimitador. Si su programa escribe solo esa línea, no hay problema. Si su programa escribe varias líneas de este tipo, por ejemplo,5gold rings 4calling birds 3french hens 2turtle doves 1partridge
sobrescribirá el archivo cada vez y terminará con solo el último valor. Si desea capturar todos los números, agregue paréntesis, como este:
(for /f "delims=abc…xyz" %x in ('C:\MyExe -param') do echo %x) > MyOutputFile.txt ↑ ↑
por lo tanto, el comando completo (hasta
echo %x
) se tratará como un solo comando y la redirección (>
) ocurrirá solo una vez. Alternativamente, simplemente cambie>
a>>
y las salidas se acumularán (pero también, todo lo que estaba en el archivo anterior seguirá allí, con la nueva salida adjunta).
Respuesta2
Esto no es trivial con un lote puro, pero lo es si usasREPL.BAT: una utilidad híbrida JScript/por lotesque realiza una búsqueda/reemplazo de expresión regular en stdin y escribe el resultado en stdout. Es un script puro que se ejecutará en cualquier máquina Windows moderna desde XP en adelante.
c:\myExe -param | repl "(\d*).*" $1 >out.txt