3

Я ознакомился с различными советами (перенаправление команд ss64.com) и хитростями, но не смог найти ответ на свой вопрос:

Вопрос

Можно ли передать команду, которую я собираюсь выполнить, в тот же перенаправленный вывод, который я буду создавать?

Пример с netstat

Входная команда

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

Фактическая команда будет выглядеть так: netstat -obna >C:\temp\netstat_with_programs.txt

Вывод (текстовый файл netstat_with_programs.txt)

Это фактическое содержимое файла netstat_with_programs.txt . (Команда в основном документирует себя в выходном файле.)

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

Пример с arp

Входная команда

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

Фактическая команда: arp -a >C:\temp\arp_output.txt

Вывод (содержимое arp_output.txt)

Это фактическое содержимое файла arp_output.txt . (Команда в основном документирует себя в выходном файле.)

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  

Таким образом, в основном я буду документировать команду, которую я выполняю в выводе, который я создаю.


Основываясь на возможных решениях, предоставленных @barlop в комментариях, я выполнил обе команды:

С ЭХО

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

... это привело к появлению следующей первой строки в выходном файле, которая не полностью удовлетворяет требованиям:

netstat -obna  
....

С переменной% aaa%

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

... это дает тот же результат, который не полностью соответствует требованиям:

netstat -obna  
...

2 ответа2

1

Это невозможно, потому что оболочка, которая принимает команду и выполняет ее, не имеет представления о аргументах, передаваемых команде.

Например, в нашем теоретическом rot13write C:\foobar.txt это P:\sbbone.gkg

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

Это может сказать rot13write записать на диск P файл foobar и расширение txt . Или все это может быть шуткой, и этот путь уже мог быть жестко запрограммирован в исполняемый файл. Вы не знаете, как и оболочка.

Таким образом, оболочка не может отобразить файл, в который таинственно пишет программа, потому что оболочка не знает об этом достаточно; и программа, которая знает, как она вызывается, не обязана что-либо делать с этими данными (например, выводить команду вызова в файл, в который она выводится). Что вы можете сделать, это

  1. Пусть оболочка повторяет все свои команды. Большинство снарядов поддерживают это.
  2. Попросите выполняемую вами программу записать в стандартный вывод (как это обычно происходит), который программа унаследует от оболочки, которая ее породила (именно так программы, которые вы вызываете, и оболочка записывают в то же место - терминал psuedo)
  3. Перенаправить стандартный вывод оболочки в файл назначения.

Это будет делать все, что вы хотите, кроме отображения флага и местоположения вывода в команде.

Это выглядит так в командной строке (я думаю)

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

И это выглядит в PowerShell,

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

Если проблема состоит в том, чтобы отобразить (или перенаправить в файл) символ перенаправления (>) с помощью команды ECHO , то вам просто нужно экранировать его. Экранирующим символом в этом случае будет ^:

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

Вторая команда в приведенном выше фрагменте использует >> вместо > потому что вы хотите добавить вывод в тот же файл, а не перезаписать его.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .