Pergunta

Pergunta

Eu dei uma olhada em várias dicas (Redirecionamento de comando ss64.com) e truques, mas não consegui encontrar uma resposta para minha pergunta:

Pergunta

É possível canalizar o comando que irei executar para a mesma saída redirecionada que irei criar?

Exemplo com netstat

Comando de entrada

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

O comando real seria:netstat -obna >C:\temp\netstat_with_programs.txt

Saída (o arquivo de texto netstat_with_programs.txt)

Este é o conteúdo real do netstat_with_programs.txtarquivo. (O comando basicamente se documenta no arquivo de saída.)

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

Exemplo com arp

Comando de entrada

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

O comando real é:arp -a >C:\temp\arp_output.txt

Saída (o conteúdo de arp_output.txt)

Este é o conteúdo real do arp_output.txtarquivo. (O comando basicamente se documenta no arquivo de saída.)

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  

Então, basicamente, eu documentaria o comando que estou executando na saída que estou criando.


Com base nas possíveis soluções fornecidas por @barlop nos comentários, segui em frente e executei os dois comandos:

Com ECO

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

... isso produziu a seguinte primeira linha no arquivo de saída, que não atende totalmente aos requisitos:

netstat -obna  
....

Com variável %aaa%

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

... isso produz a mesma saída, que não atende totalmente aos requisitos:

netstat -obna  
...

Responder1

Isso é impossível porque o shell, que recebe o comando e o executa, não tem ideia do que fazem os argumentos que está passando para o comando.

Por exemplo, em nossa teoria rot13write C:\foobar.txt, éP:\sbbone.gkg

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

Isso pode indicar rot13writepara gravar na unidade P, no arquivo foobare na extensão txt. Ou pode ser tudo uma piada e esse caminhopoderiajá foram codificados no executável. Você não sabe, e nem uma concha.

Então a casca podenãoecho para o arquivo no qual um programa está gravando misteriosamente, porque o shell não sabe disso o suficiente; e o programa que sabe como é invocado não tem obrigação de fazer nada com esses dados (como imprimir o comando de invocação no arquivo para o qual está sendo enviado). O que você pode fazer é

  1. Faça com que o shell ecoe todos os seus comandos. A maioria dos shells suporta isso.
  2. Faça com que o programa que você executa grave na saída padrão (como normalmente faz), que o programa herdará do shell que o gerou (é assim que os programas que você chama e o shell gravam no mesmo local - o terminal psuedo)
  3. Redirecione a saída padrão do shell para o arquivo de destino.

Isso fará tudo o que você quiserexcetomostre o sinalizador e o local de saída no comando.

Isso se parece com isso emprompt de comando (eu acho)

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

E fica assim no PowerShell,

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

Responder2

Se o problema for exibir (ou redirecionar para um arquivo) o símbolo de redirecionamento ( >) com o ECHOcomando, então você só precisa escapar dele. O símbolo de escape neste caso seria ^:

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

O segundo comando no trecho acima está sendo usado >>em vez de >porque você deseja adicionar a saída ao mesmo arquivo em vez de substituí-la.

informação relacionada