Pregunta

Pregunta

He echado un vistazo a varios consejos (Redirección de comandos ss64.com) y trucos pero no pude encontrar una respuesta a mi pregunta:

Pregunta

¿Es posible canalizar el comando que voy a ejecutar a la misma salida redirigida que crearé?

Ejemplo con netstat

Comando de entrada

C:\Users\memyselfandi> netstat -obna >C:\temp\netstat_with_programs.txt

El comando real sería:netstat -obna >C:\temp\netstat_with_programs.txt

Salida (el archivo de texto netstat_with_programs.txt)

Este es el contenido real del netstat_with_programs.txtarchivo. (Básicamente, el comando se documenta a sí mismo en el archivo de salida.)

netstat -obna >C:\temp\netstat_with_programs.txt
Active connections

  Proto  Local Address          Remoteaddress          State             PID
  TCP    0.0.0.0:135            0.0.0.0:0              LISTENING         888
  RpcSs
 [svchost.exe]
  TCP    0.0.0.0:2382           0.0.0.0:0              LISTENING         1396
 [sqlbrowser.exe]
  TCP    0.0.0.0:3389           0.0.0.0:0              LISTENING         376
  TermService
 [svchost.exe]
....

Ejemplo con arp

Comando de entrada

C:\users\memyselfandi> arp -a >C:\temp\arp_output.txt

El comando real es:arp -a >C:\temp\arp_output.txt

Salida (El contenido de arp_output.txt)

Este es el contenido real del arp_output.txtarchivo. (Básicamente, el comando se documenta a sí mismo en el archivo de salida.)

arp -a >C:\temp\arp_output.txt
Interface: 10.57.209.191 --- 0x5
  Internet Address      Physical Address      Type
  10.57.209.2           80-e0-1d-58-8a-50     dynamic 
  10.57.209.3           80-e0-1d-58-8b-88     dynamic 
  10.57.209.9           00-50-56-8d-91-fe     dynamic 
  10.57.209.10          00-50-56-8d-91-fe     dynamic 
  10.57.209.175         00-50-56-b5-44-16     dynamic 
  10.57.209.255         ff-ff-ff-ff-ff-ff     static  
  224.0.0.22            01-00-5e-00-00-16     static  
  224.0.0.252           01-00-5e-00-00-fc     static  
  230.0.0.1             01-00-5e-00-00-01     static  
  239.255.255.250       01-00-5e-7f-ff-fa     static  

Básicamente, estaría documentando el comando que estoy ejecutando en el resultado que estoy creando.


Según las posibles soluciones proporcionadas por @barlop en los comentarios, seguí adelante y ejecuté ambos comandos:

Con ECO

echo netstat -obna >C:\temp\netstat_with_programs.txt && netstat -obna >>C:\temp\netstat_with_programs.txt

...esto produjo la siguiente primera línea en el archivo de salida, que no satisface completamente los requisitos:

netstat -obna  
....

Con %aaa% variable

set aaa=netstat -obna
echo (%aaa%>C:\temp\netstat_with_programs.txt) && (echo %aaa%|cmd)>>C:\temp\netstat_with_programs.txt

... esto produce el mismo resultado, que no cumple completamente con los requisitos:

netstat -obna  
...

Respuesta1

Esto es imposible porque el shell, que toma el comando y lo ejecuta, no tiene idea de qué hacen los argumentos que le pasa al comando.

Por ejemplo en nuestra teoría rot13write C:\foobar.txt, esP:\sbbone.gkg

rot13write -qevir "P" -svyr "sbbone" rkg ".gkg"

Eso puede indicarle rot13writeque escriba en la unidad P, el archivo foobary la extensión txt. O puede que sea todo una broma y ese caminopodríaya han sido codificados en el ejecutable. No lo sabes, y tampoco lo sabe un caparazón.

Entonces el caparazón puedenohacer eco al archivo en el que un programa está escribiendo misteriosamente, porque el shell no lo sabe lo suficiente; y el programa que sabe cómo se invoca no tiene la obligación de hacer nada con esos datos (como imprimir el comando de invocación en el archivo al que se envía). Lo que puedes hacer es

  1. Haga que el shell repita todos sus comandos. La mayoría de los shells admiten esto.
  2. Haga que el programa que ejecute escriba en la salida estándar (como lo hace normalmente) que el programa heredará del shell que lo generó (así es como los programas que usted llama y el shell escriben en el mismo lugar: el terminal psuedo)
  3. Redirija la salida estándar del shell al archivo de destino.

Esto hará todo lo que quierasexceptomuestre la bandera y la ubicación de salida en el comando.

Esto se ve así ensímbolo del sistema (creo)

cmd /c "netstat" > myOutput.txt | type myOutput.txt

Y se ve así en PowerShell,

powershell -command "Set-PSDebug -Trace 1; netstat" | tee myOutput.txt

Respuesta2

Si el problema es mostrar (o redirigir a un archivo) el símbolo de redirección ( >) con el ECHOcomando, entonces sólo necesita escapar. El símbolo de escape en este caso sería ^:

ECHO netstat -obna ^>C:\temp\netstat_with_programs.txt >C:\temp\netstat_with_programs.txt
netstat -obna >>C:\temp\netstat_with_programs.txt

El segundo comando en el fragmento anterior se usa >>en lugar de >porque desea agregar la salida al mismo archivo en lugar de sobrescribirlo.

información relacionada