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.txt
archivo. (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.txt
archivo. (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 rot13write
que escriba en la unidad P
, el archivo foobar
y 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
- Haga que el shell repita todos sus comandos. La mayoría de los shells admiten esto.
- 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)
- 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 ECHO
comando, 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.