질문

질문

다양한 팁을 살펴보았습니다(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.txtP:\sbbone.gkg

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

이는 rot13write드라이브 P, 파일 foobar및 확장자 에 쓰라고 지시할 수 있습니다 txt. 아니면 다 장난일 수도 있고 그 길도~할 수 있었다이미 실행 파일에 하드 코딩되어 있습니다. 당신은 모르고 껍질도 모릅니다.

그래서 쉘은~ 아니다프로그램이 신비롭게 쓰고 있는 파일에 에코를 보냅니다. 왜냐하면 쉘은 그것에 대해 충분히 알지 못하기 때문입니다. 그리고 호출 방법을 아는 프로그램은 해당 데이터를 사용하여 어떤 작업도 수행할 의무가 없습니다(예: 출력하는 파일에 호출 명령을 인쇄하는 등). 당신이 할 수 있는 일은

  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

위 코드 조각의 두 번째 명령은 출력을 덮어쓰는 대신 동일한 파일에 추가하기를 원하기 때문에 >>대신 사용됩니다.>

관련 정보