Я просмотрел различные советы (Перенаправление команд 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 в файл, в который программа таинственным образом записывает данные, потому что оболочка не знает об этом достаточно; и программа, которая знает, как она вызывается, не обязана что-либо делать с этими данными (например, печатать команду вызова в файл, в который она выводит данные). Что вы можете сделать, так это
- Заставить оболочку выводить все свои команды. Большинство оболочек поддерживают это.
- Заставьте программу, которую вы запускаете, записывать данные в стандартный вывод (как это обычно и происходит), который программа унаследует от оболочки, ее породившей (именно так программы, которые вы вызываете, и оболочка записывают данные в одно и то же место — псевдотерминал).
- Перенаправить стандартный вывод оболочки в целевой файл.
Это сделает все, что вы хотите.кромепоказать флаг и расположение выходных данных в команде.
Это выглядит так вкомандная строка (я думаю)
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
Вторая команда в приведенном выше фрагменте использует >>
вместо , >
поскольку вы хотите добавить вывод в тот же файл, а не перезаписывать его.