Polecenie Pipe wykonane do tego samego pliku wyjściowego polecenia

3

Sprawdziłem różne wskazówki ( Przekierowanie komendy ss64.com ) i sztuczki, ale nie mogłem znaleźć odpowiedzi na moje pytanie:

Pytanie

Czy możliwe jest wprowadzenie polecenia, które zamierzam wykonać, do tego samego przekierowanego wyjścia, które będę tworzył?

Przykład z netstat

Polecenie wejściowe

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

Rzeczywiste polecenie brzmi: netstat -obna >C:\temp\netstat_with_programs.txt

Wyjście (plik tekstowy netstat_with_programs.txt)

To jest rzeczywista zawartość netstat_with_programs.txt plik. ( Polecenie zasadniczo dokumentuje się w pliku wyjściowym. )

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

Przykład z arp

Polecenie wejściowe

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

Rzeczywiste polecenie to: arp -a >C:\temp\arp_output.txt

Dane wyjściowe (zawartość arp_output.txt)

To jest rzeczywista zawartość arp_output.txt plik. ( Polecenie zasadniczo dokumentuje się w pliku wyjściowym. )

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  

Więc zasadniczo dokumentowałbym polecenie, które wykonuję w tworzonym przeze mnie wyjściu.


W oparciu o możliwe rozwiązania dostarczone przez @barlop w komentarzach, poszedłem dalej i wykonałem oba polecenia:

Z ECHO

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

... spowodowało to powstanie następującego pierwszego wiersza w pliku wyjściowym, który nie spełnia w pełni wymagań:

netstat -obna  
....

Z zmienną% aaa%

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

... powoduje to taką samą wydajność, która nie spełnia w pełni wymagań:

netstat -obna  
...
hot2use
źródło
Twój angielski jest całkowicie niejednoznaczny, a zatem nie jest jasne, o co pytasz. Powinieneś podać przykłady pokazujące dokładnie, co masz na myśli. Pokaż zawartość C:\temp\netstat_with_programs.txt przed i po. Demonstrowanie dokładnie tego, co masz na myśli, a nie próbowanie użycia wysoce ambitnych słów.
barlop
Również twój tytuł nie wskazuje dokładnie, o czym mówisz
barlop
Chciałbym wiedzieć, która część mojego pytania jest niejednoznaczna? Wkład jest jasno określony w moim pytaniu. netstat -obna >C:\temp\netstat_with_programs.txt. Wyjściem mojego polecenia jest plik tekstowy zawierający zawartość opisaną w Wydajność część mojego pytania, która zawiera polecenie, które wykonałem. Nie sądzę, aby moje pytanie było albo niejednoznaczne, albo składniowe, ortograficzne lub typograficznie niepoprawne. Byłbym wdzięczny, gdybyś mógł dokładnie wyjaśnić, której części pytania nie jesteś w stanie zrozumieć.
hot2use
Ponieważ to jest > plik wcześniej nie istniał. Nie dodaję ( >> ) do istniejącego pliku.
hot2use
Poprawiłeś teraz niejasną część pytania
barlop

Odpowiedzi:

1

Jest to niemożliwe, ponieważ powłoka, która pobiera polecenie i wykonuje je, nie ma pojęcia, co robią argumenty przekazane do polecenia.

Na przykład w naszej teorii rot13write C:\foobar.txt, jest P:\sbbone.gkg

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

To może powiedzieć rot13write napisać na dysk P, plik foobari rozszerzenie txt. Albo może to być żart i ta ścieżka mógłby zostały już zakodowane w pliku wykonywalnym. Nie wiesz, ani powłoka.

Więc powłoka może nie echo do pliku, do którego program tajemniczo pisze, ponieważ powłoka nie wie o tym wystarczająco; i program, który wie, jak się go wywołuje, nie ma obowiązku niczego robić z tymi danymi (np. wydrukować polecenie wywołania do pliku, do którego jest wysyłane). Co możesz zrobić, to

  1. Niech powłoka wykona echo wszystkich swoich poleceń. Większość muszli to obsługuje.
  2. Miej program, który wykonujesz, zapisuj do standardowego wyjścia (jak to zwykle robi), który program odziedziczy po powłoce, która go zrodziła (tak programy, które wywołujesz i powłoka, zapisują w tym samym miejscu - terminal psuedo)
  3. Przekieruj standardowe wyjście powłoki do pliku docelowego.

To zrobi wszystko, co chcesz z wyjątkiem pokaż flagę i lokalizację wyjściową w poleceniu.

To wygląda tak wiersz polecenia (chyba)

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

I wygląda to tak w PowerShell,

powershell -command "Set-PSDebug -Trace 1; netstat" | tee myOutput.txt
Evan Carroll
źródło
1

Jeśli problem polega na wyświetleniu (lub przekierowaniu do pliku) symbolu przekierowania ( > ) z ECHO polecenie, po prostu musisz uciec. W tym przypadku symbolem ucieczki będzie ^:

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

Drugie polecenie w powyższym urywku używa >> zamiast > ponieważ chcesz dodać wyjście do tego samego pliku, zamiast go nadpisać.

Andriy M
źródło
Zacząłem się zastanawiać, dlaczego to nie zadziałało, dopóki nie zrozumiałem, że twoim rozwiązaniem jest wykonanie dwóch poleceń. Dobre rozwiązanie, ale nieco przełamuje przepływ.
hot2use