Вопрос

Вопрос

Я просмотрел различные советы (Перенаправление команд 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  
...

решение1

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

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

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

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

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

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

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

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

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

И вот так это выглядит в PowerShell:

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

решение2

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

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

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

Связанный контент