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