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.txt
Datei. (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.txt
Datei. (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, rot13write
auf das Laufwerk P
, die Datei foobar
und 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
- Lassen Sie die Shell alle ihre Befehle wiedergeben. Die meisten Shells unterstützen dies.
- 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).
- 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 ECHO
Befehl 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.