Equivalente por lotes de comillas inversas de Bash

Respuestas:

53

Puede hacerlo redirigiendo la salida a un archivo primero. Por ejemplo:

echo zz > bla.txt
set /p VV=<bla.txt
echo %VV%
zvrba
fuente
16
Requiere que encuentre un lugar donde tenga acceso de escritura para almacenar el archivo temporal; tienes que limpiar después de ti mismo; este mismo ejemplo solo le permite leer la primera línea de entrada. A todos los efectos prácticos, la for /fvariante es mucho mejor.
Joey
@grawity - junto con%random%
bacar
1
@joey Lee cada línea, pero cómo concatenar a un argumento de línea de comando en un solo comando.
user877329
¿Cómo maneja las nuevas líneas?
andrewrk
103

Puede obtener una funcionalidad similar usando scripts cmd.exe con el for /fcomando:

for /f "usebackq tokens=*" %%a in (`echo Test`) do my_command %%a

Sí, no es un poco obvio (por decir lo menos), pero es lo que hay.

Consulte for /?los detalles sangrientos.

Nota al margen: Pensé que para usar " echo" dentro de las comillas inversas en un for /fcomando " " tendría que hacerse usando " cmd.exe /c echo Test" ya que echoes un comando interno de cmd.exe, pero funciona de una manera más natural. Los scripts por lotes de Windows siempre me sorprenden de alguna manera (pero generalmente no en el buen sentido).

Michael Burr
fuente
2
Por lo general, debe hacer esto cuando ejecuta shell-builtins desde programas externos que no generan automáticamente un shell. Es decir, C system()estaba bien, iirc, ya que inicia un shell en cualquier caso, pero .NET Process.Startnecesita invocar explícitamente el shell. Algo así, iirc. En cualquier caso, considero que esta es la mejor respuesta que la aceptada :-)
Joey
2
Las opciones para forno lastimar pero confundir el problema. ¿Qué hay de esto?for /f %%a in ('"echo Test"') do my_command %%a
Evan Haas
9
Use un solo% en lugar de %% cuando ejecute lo mismo en la línea de comando, en lugar de en un script por lotes.
Tarro del
2
No parece funcionar bien con tuberías, por ejemplo, el operador ">". Pero por lo demás, esto es asombroso. A menos que esto fuera solo un problema% vs %% que tuve.
Jonathan
3
@Evan: tokens=*es importante. De lo contrario, si el resultado del comando incluye espacios, solo se emite la primera palabra. Ejecutar este en el símbolo: for /f %a in ('"echo foo bar"') do echo "%a". Se imprimirá "foo".
Dan Dascalescu
29

Lea la documentación del comando "for": for /?

Lamentablemente, no he iniciado sesión en Windows para verificarlo yo mismo, pero creo que algo como esto puede aproximarse a lo que desea:

for /F %i in ('echo Test') do my_command %i
Weeble
fuente
6
En caso de que alguien más tropiece con esto, cuando el comando se ejecuta desde un archivo por lotes (* .bat), ambas variables% i deben tener el doble signo de porcentaje: %% i.
mgouin
3

Siempre puedes ejecutar Bash dentro de Windows. Lo hago todo el tiempo con MSYS (mucho más eficiente que Cygwin ).

davr
fuente
Desafortunadamente, MSYS apenas se mantiene ahora, para obtener un bash actualizado, debe instalarlo por separado
Ed Randall
1
BusyBox es aún más pequeño (~ 432KB). Sin embargo, no un Bash completo, solo Ash. Obtenga el puerto no oficial de
Martin
3

Quizás estoy arruinando la sintaxis del for /fmétodo estándar , pero cuando pongo un comando muy complejo que involucra && y | dentro de las comillas invertidas en el límite del for /f, causa problemas. Es posible una ligera modificación de lo habitual para manejar un comando de complejidad arbitraria:

SET VV=some_command -many -arguments && another_command -requiring -the-other -command | handling_of_output | more_handling
for /f "usebackq tokens=*" %%a in (`%VV%`) do mycommand %%a

Al poner su comando completo y complejo en una variable primero, luego poner una referencia a la variable en el límite en lugar de colocar el comando complejo directamente en el límite del bucle for, puede evitar problemas de interpretación de sintaxis. Actualmente, si copio el comando exacto que configuré en la VVvariable en el ejemplo anterior en donde se usa, %VV%causa errores de sintaxis.

mtalexan
fuente
1
Esto no funcionó para mí, pero descubrí que puedes hacer tuberías directamente dentro del comando for si lo escapas con un quilate (^): for / f "usebackq tokens = *" %% a in (`command ^ | command`) do command %% a
Heptita
El escape de la tarjeta @Heptite no funcionó para mí, pero la línea de comando circundante con comillas dobles sí.
Alexandr Zarubkin
@Heptite En mi caso, no sabía de antemano la serie de comandos que iba a necesitar ejecutar, se extrajeron de un archivo en un caso y se pasaron en otro. Con el escape, necesita saber cuántas veces debe escapar el comando en función de cuántos intérpretes se ejecutará y, en mis casos de uso, ese no fue un número constante de intérpretes.
mtalexan