Establecer la salida de un comando como una variable (con tuberías)

¿Puedes redirigir la salida de un comando a una variable con pipes?

No lo he intentado mucho ya que no he podido pensar en nada para probar, pero he probado un método (con dos variaciones) …

Por ejemplo:

echo Hello|set text= 

No funcionó, tampoco lo hizo:

 echo Hello | set text= 

Sé que puedes hacerlo bastante fácilmente con el comando FOR , pero creo que se vería “mejor” con una tubería.

Y si te estás preguntando, no tengo una razón específica para preguntarle esto, aparte de que tengo curiosidad y no puedo encontrar la respuesta.

Tu camino no puede funcionar por dos razones.

Necesita usar set /p text= para configurar la variable con la entrada del usuario .
El otro problema es la tubería.
Un conducto inicia dos instancias cmd.exe asíncronas y, después de finalizar el trabajo, ambas instancias se cierran.

Esa es la razón por la que parece que las variables no están establecidas, pero un pequeño ejemplo muestra que están configuradas pero el resultado se pierde más adelante.

 set myVar=origin echo Hello | (set /p myVar= & set myVar) set myVar 

Salidas

 Hello origin 

Alternativas: puede usar el ciclo FOR para obtener valores en variables o también archivos temporales.

 for /f "delims=" %%A in ('echo hello') do set "var=%%A" echo %var% 

o

 >output.tmp echo Hello >>output.tmp echo world  

La falta de una instalación de backtick / backquote similar a Linux es una gran molestia del mundo anterior a PowerShell. El uso de comillas inversas a través de for-loops no es para nada acogedor. Entonces, necesitamos un poco del setvar myvar cmd-line .

En mi %path% , tengo un directorio con una cantidad de bandejas y lotes para hacer frente a las fallas de Win.

Un lote que escribí es:

 :: setvar varname cmd :: Set VARNAME to the output of CMD :: Triple escape pipes, eg: :: setvar x dir c:\ ^^^| sort :: ----------------------------- @echo off SETLOCAL :: Get command from argument for /F "tokens=1,*" %%a in ("%*") do set cmd=%%b :: Get output and set var for /F "usebackq delims=" %%a in (`%cmd%`) do ( ENDLOCAL set %1=%%a ) :: Show results SETLOCAL EnableDelayedExpansion echo %1=!%1! 

Entonces en tu caso, escribirías:

 > setvar text echo Hello text=Hello 

El script le informa de los resultados, lo que significa que puede:

 > echo text var is now %text% text var is now Hello 

Puedes usar cualquier comando:

 > setvar text FIND "Jones" names.txt 

¿Qué sucede si el comando que desea canalizar a una variable contiene un conducto?
Triple escape, ^^^| :

 > setvar text dir c:\ ^^^| find "Win" 

ESTO NO UTILIZA TUBOS, pero requiere un solo archivo de temp.
Usé esto para poner sellos de tiempo simplificados en un archivo de mantenimiento diario de baja tecnología

Ya hemos formateado brevemente nuestro Sistema-Tiempo a HHmm, (que es 2245 para 10:45 PM)
Dirijo la salida de Maint-Routines a los archivos de registro con un $ DATE% @% TIME% timestamp;
. . . pero% TIME% es una cadena larga y fea (por ejemplo, 224513.56, por debajo de las centésimas de segundo)

RESUMEN DE LA SOLUCIÓN:
1. Use la redirección (“>”) para enviar el comando “TIME / T” cada vez para OVERWRITE un archivo temporal en el directorio% TEMP%
2. Luego use ese archivo temporal como entrada para establecer una nueva variable (lo llamé AHORA)
3. Reemplazar

  echo $ DATE% @% TIME% blah-blah-blah >>% logfile% 

con

  echo $ DATE% @% AHORA% blah-blah-blah >>% logfile% 

==== DIFERENCIA EN LA SALIDA:
ANTES DE:

  EXITOSO TIMESYNCH 29Dec14@222552.30 

DESPUÉS:

  TIEMPO DE ÉXITO 29dec14 @ 2252 

CÓDIGO REAL:

  TIME / T>% TEMP% \ DailyTemp.txt
 SET / p NOW = <% TEMP% \ DailyTemp.txt
 echo $ DATE% @% AHORA% blah-blah-blah >>% logfile% 

SECUELAS:
Todo lo que queda después es el archivo de registro adjunto, y el archivo temporal constantemente sobrescrito. Y si alguna vez se elimina el archivo temporal, se volverá a crear según sea necesario.

En un archivo de proceso por lotes generalmente creo un archivo en el directorio temporal y anexo el resultado de un progtwig, luego lo llamo con un nombre de variable para establecer esa variable. Me gusta esto:

 :: Create a set_var.cmd file containing: set %1= set /p="set %%1=""%temp%\set_var.cmd" :: Append output from a command ipconfig | find "IPv4" >> "%temp%\set_var.cmd" call "%temp%\set_var.cmd" IPAddress echo %IPAddress% 

Puede establecer el resultado en un archivo temporal y leer los datos del archivo después de que pueda eliminar el archivo temporal.

 echo %date%>temp.txt set /p myVarDate= < temp.txt echo Date is %myVarDate% del temp.txt 

En esta variable " myVarDate " contiene la salida del comando