質問

質問

いろいろなヒントを見てきました(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で

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。あるいは、それはすべて冗談で、そのパスかもしれませんできたすでに実行可能ファイルにハードコードされています。あなたにはわかりませんし、シェルにもわかりません。

だからシェルはないシェルはそれを十分に知らないため、プログラムが不可解な書き込みを行っているファイルに 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

上記のスニペットの 2 番目のコマンドでは、出力を上書きするのではなく同じファイルに追加するため、>>の代わりにを使用しています。>

関連情報