Frage

Frage

Ich habe mir verschiedene Tipps angesehen (ss64.com-Befehlsumleitung) und Tricks, konnte aber keine Antwort auf meine Frage finden:

Frage

Ist es möglich, den Befehl, den ich ausführen werde, in dieselbe umgeleitete Ausgabe umzuleiten, die ich erstellen werde?

Beispiel mit netstat

Eingabebefehl

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

Der eigentliche Befehl wäre:netstat -obna >C:\temp\netstat_with_programs.txt

Ausgabe (Die Textdatei netstat_with_programs.txt)

Dies ist der eigentliche Inhalt der netstat_with_programs.txtDatei. (Der Befehl dokumentiert sich grundsätzlich selbst in der Ausgabedatei.)

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]
....

Beispiel mit arp

Eingabebefehl

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

Der eigentliche Befehl lautet:arp -a >C:\temp\arp_output.txt

Ausgabe (Der Inhalt von arp_output.txt)

Dies ist der eigentliche Inhalt der arp_output.txtDatei. (Der Befehl dokumentiert sich grundsätzlich selbst in der Ausgabedatei.)

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  

Grundsätzlich würde ich also den Befehl, den ich ausführe, in der Ausgabe dokumentieren, die ich erstelle.


Basierend auf den möglichen Lösungen, die @barlop in den Kommentaren angab, ging ich weiter und führte beide Befehle aus:

Mit ECHO

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

...dadurch entstand in der Ausgabedatei folgende erste Zeile, welche die Anforderungen nicht ganz erfüllt:

netstat -obna  
....

Mit der Variable %aaa%

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

...dies führt zum gleichen Ergebnis, das die Anforderungen jedoch nicht ganz erfüllt:

netstat -obna  
...

Antwort1

Dies ist unmöglich, da die Shell, die den Befehl entgegennimmt und ausführt, keine Ahnung hat, was die Argumente bewirken, die sie an den Befehl übergibt.

Zum Beispiel in unserer theoretischen rot13write C:\foobar.txt, istP:\sbbone.gkg

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

Das kann sagen, rot13writeauf das Laufwerk P, die Datei foobarund die Erweiterung zu schreiben txt. Oder es kann alles ein Witz sein und dieser Pfadkönntewurden bereits fest in die ausführbare Datei codiert. Sie wissen es nicht, und eine Shell auch nicht.

Die Schale kann alsonichtecho an die Datei, in die ein Programm auf mysteriöse Weise schreibt, weil die Shell das nicht ausreichend weiß; und das Programm, das weiß, wie es aufgerufen wird, ist nicht verpflichtet, irgendetwas mit diesen Daten zu tun (wie den Aufrufbefehl in die Datei zu drucken, in die er ausgibt). Was Sie tun können, ist

  1. Lassen Sie die Shell alle ihre Befehle wiedergeben. Die meisten Shells unterstützen dies.
  2. Lassen Sie das von Ihnen ausgeführte Programm in die Standardausgabe schreiben (wie es normalerweise der Fall ist), die das Programm von der Shell erbt, die es erzeugt hat (so schreiben von Ihnen aufgerufene Programme und die Shell an dieselbe Stelle – das Pseudoterminal).
  3. Leiten Sie die Standardausgabe der Shell zur Zieldatei um.

Dies wird alles tun, was Sie wollenaußerZeigen Sie das Flag und den Ausgabeort im Befehl an.

Das sieht so aus inEingabeaufforderung (glaube ich)

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

In PowerShell sieht es folgendermaßen aus:

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

Antwort2

Wenn das Problem darin besteht, das Umleitungssymbol ( >) mit dem ECHOBefehl anzuzeigen (oder zu einer Datei umzuleiten), müssen Sie es nur escapen. Das Escape-Symbol wäre in diesem Fall ^:

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

Der zweite Befehl im obigen Snippet verwendet >>anstelle von >, weil Sie die Ausgabe derselben Datei hinzufügen und nicht überschreiben möchten.

verwandte Informationen