Estoy buscando obtener el resultado de un comando como una variable en un script por lotes de Windows (vea cómo obtener el resultado de un comando en bash para el equivalente de script de bash). Se prefiere una solución que funcione en un archivo .bat, pero también son bienvenidas otras soluciones comunes de secuencias de comandos de Windows.
windows
scripting
batch-file
John Meagher
fuente
fuente
Respuestas:
Si tiene que capturar toda la salida del comando, puede usar un lote como este:
Todas las líneas de salida se almacenan en VAR separadas con "!".
@John: ¿hay algún uso práctico para esto? Creo que debería ver PowerShell o cualquier otro lenguaje de programación capaz de realizar tareas de secuencias de comandos fácilmente (Python, Perl, PHP, Ruby)
fuente
cmd
para que pueda ejecutarlo allí. ... Sí, esto es tan terrible como los sonidos. Visual Studio me da ganas de llorar a veces. @ Ajedi32 Creo que querías decir que los scripts por lotes son una reliquia horrible del pasado. ;)El humilde de comando ha acumulado algunas capacidades interesantes a lo largo de los años:
Tenga en cuenta que
"delims="
sobrescribe el espacio predeterminado y los delimitadores de tabulación para que la salida del comando de fecha se engulle de una vez.Para capturar la salida multilínea, todavía puede ser esencialmente una línea (usando la variable lf como delimitador en la variable resultante):
Para capturar una expresión canalizada, use
^|
:fuente
FOR /F "delims=" %%i IN ('date /t') DO set today=%%i
for
comando directamente en la línea de comando, usa uno simple%
. Si lo usa en un archivo por lotes, lo usa%%
.%
, por ejemplo:for /f "delims=" %%i in ('date +%F_%H-%M-%S') do set now=%%i
date
comando utilizado provenga de Cygwin. Estoy de acuerdo en que debería haber mencionado eso.Para obtener el directorio actual, puede usar esto:
Sin embargo, está usando un archivo temporal, por lo que no es el más bonito, ¡pero ciertamente funciona! 'CD' pone el directorio actual en 'tmpFile', 'SET' carga el contenido de tmpFile.
Aquí hay una solución para varias líneas con "matriz":
Pero es posible que desee considerar mudarse a otro shell más potente o crear una aplicación para estas cosas. Extiende bastante las posibilidades de los archivos por lotes.
fuente
necesita usar el
SET
comando con parámetro/P
y dirigir su salida a él. Por ejemplo, consulte http://www.ss64.com/nt/set.html . Funcionará para CMD, no estoy seguro acerca de los archivos .BATDe un comentario a esta publicación:
fuente
Ejemplo para establecer en la variable de entorno "V" el archivo más reciente
en un archivo por lotes, debe usar el prefijo doble en la variable de bucle:
fuente
Solo usa el resultado del
FOR
comando. Por ejemplo (dentro de un archivo por lotes):Puede usar el
%%I
como el valor que desee. Al igual que este:%%I
.¡Y de antemano
%%I
no tiene espacios ni caracteres CR y puede usarse para comparaciones!fuente
Si está buscando la solución proporcionada en ¿Cómo usar el resultado de un comando como argumento en bash?
entonces aquí está el código:
[Créditos] : Gracias a todas las otras respuestas y algunas excavaciones en la página de comandos de Windows XP .
fuente
fuente
Me gustaría agregar un comentario a las soluciones anteriores:
Todas estas sintaxis funcionan perfectamente bien SI SU COMANDO SE ENCUENTRA DENTRO DEL CAMINO o SI EL COMANDO ES UN CMDpath SIN ESPACIOS O CARACTERES ESPECIALES.
Pero si intenta usar un comando ejecutable ubicado en una carpeta cuya ruta contiene caracteres especiales, entonces necesitará encerrar su ruta de comando entre comillas dobles (") y luego la sintaxis FOR / F no funciona.
Ejemplos:
o
o
En ese caso, la única solución que encontré para usar un comando y almacenar su resultado en una variable es establecer (temporalmente) el directorio predeterminado en el comando en sí:
El resultado es entonces correcto:
Por supuesto, en el ejemplo anterior, supongo que mi script por lotes se encuentra en la misma carpeta que la de mi comando ejecutable para que pueda usar la sintaxis "% ~ d0% ~ p0". Si este no es su caso, entonces debe encontrar una manera de ubicar su ruta de comando y cambiar el directorio predeterminado a su ruta.
NB: Para aquellos que se preguntan, el comando de muestra utilizado aquí (para seleccionar una carpeta) es FOLDERBROWSE.EXE. Lo encontré en el sitio web f2ko.de ( http://f2ko.de/en/cmd.php ).
Si alguien tiene una mejor solución para ese tipo de comandos accesibles a través de una ruta compleja, me alegrará saberlo.
Gilles
fuente
CALL
. FOR / F no funciona si la ruta tiene espaciosCALL "%SOURCEDIR%\FOLDERBROWSE" ... "quoted parameters"
> funciona perfectamente.Puede capturar toda la salida en una variable, pero las líneas estarán separadas por un carácter de su elección (# en el ejemplo a continuación) en lugar de un CR-LF real.
Segunda versión, si necesita imprimir el contenido línea por línea. Esto aprovecha el hecho de que no habrá líneas de salida duplicadas de "dir / b", por lo que puede no funcionar en el caso general.
fuente
el resultado es 'TXT: hola'
fuente
Debe usar el
for
comando, aquí hay un ejemplo:y puede usar,
call :output "Command goes here"
entonces la salida estará en la%output%
variable.Nota: Si tiene una salida de comando que es multilínea, esta herramienta mostrará
set
la última línea de su comando multilínea.fuente
Consulte esta http://technet.microsoft.com/en-us/library/bb490982.aspx que explica lo que puede hacer con la salida del comando.
fuente
git pull>0 set /P RESULTVAR=<0
editar: supongo, no sé cómo usar saltos de línea aquí ... cada comando está en su propia línea.