この投稿の最新更新日は2020年12月7日です。
4分で読めます。
たまに、コンソール アプリケーションを実行したときのコンソール出力 (またはトランスクリプト) をどうにかしてダンプする必要がある状況に遭遇することがあります。 私の場合は、通常はAzureにデプロイして顧客のサーバーで実行するWebジョブや関数を、顧客が必要としているときにはいつでもそうなります。
問題点
目次
何かが壊れたり、アプリがクラッシュしたりして、そのエラーがイベント ログに記録されます…。 実際に何が起こっているのかを把握するために、すべてを把握したいと思いますが、イベント ログはそのための方法ではありません。
あるいは、他の人に起こったエラーを調査しているが、コンソール エラーやイベント ログ エラーのスクリーンショットしか得られない、代わりに問題に関するすべての可能な情報を得たい、というような場合です。
幸いなことに、とても簡単です。 パイプ、ダンプ、リダイレクト、ログ、ミラー、または単に出力を想像可能なほとんどのターゲット メディアに保存する複数の方法がありますが、いつもググって探すのは嫌なので (そしてどうしても暗記できないので)、ここでは私が好む方法を文書化しています。
出力をファイルにパイプする必要はありません。パイプと「Out-File -FilePath」などのコマンドでできることを、リダイレクトがネイティブに実行してくれるからです。
Powershell で出力をファイルにリダイレクトするには?
次のようにすると、コンソール出力全体 (したがって、実行ファイルの PowerShell トランスクリプト全体) をテキスト ファイルに向けることができます:
executable.exe > output.txt 2>&1
OR
executable.exe *>&> output.txt
このメソッドは、コンソールウィンドウのすべての内容をファイルに書き込むだけのシンプルなものです。
そして、もちろんです。 もちろん、コマンド プロンプト (cmd.exe) だけではなく、Windows でも動作します。exe)だけでなく、Windows PowerShellでも動作します。
この動作を確認したい場合は、PowerShellで以下を実行します。 最初に「Hello World」を出力し、その後、単純にファイル出力にリダイレクトします。txt:
echo “Hello World” >output.txt 2>&1.output.txt
2番目のコマンドは、テキストエディターでoutput.txtを開き、”Hello World “が含まれていることを確認します。
これらの例では、以下のパラメータが結果に影響を与えます。
要素 | 説明 |
リダイレクト演算子です。 > | コマンドの出力をコマンドプロンプトのウィンドウではなく、ファイルやプリンターなどのデバイスに書き込みます。 |
2>&1 | これらのパラメータは、このコマンドがまずstdout(標準出力ストリーム)を出力ファイルにリダイレクトし、次にstderr(標準エラーストリーム)をそこにリダイレクトします。 |
OK – これでようやくドキュメント化されました。
でも、コンソール ウィンドウからのコピーよりも優れているのでしょうか?
無人でアプリケーションを実行していなければ、アプリケーションを実行して、ウィンドウから好きな場所にコピー ペーストすることができます。 これは簡単でいいですね。
いくつかのことが思い浮かびます。
コンソール出力をファイルにダンプすることが単なるコピー ペーストよりも優れている理由
- 無人でトランスクリプトを得ることができます。
- この方法では、出力の一部を選択してコピーを失敗することはありません。
- あなたはどうかわかりませんが、私はよくコンソールまたは PowerShell ウィンドウからのコピー貼り付けを失敗します。
- この方法は、コンソール アプリケーションを実行したときの出力/トランスクリプト全体を他の人に尋ねるために見つけた最も簡単な方法です。
Further thoughts
出力シナリオに関する詳細およびオプションについては、Stack Overflow のスレッドを参照してください。
さらに参考までに、最近の PowerShell のバージョンでサポートされているすべてのリダイレクト演算子のリストを示します (おそらく PowerShell >5.1 で有効)。1):
Redirection | それは何をするものですか? |
---|---|
> | 出力を指定したファイルに送る |
>> | 出力を 指定されたファイルの内容に追加します |
2> | エラーを指定されたファイルに送信します。 |
2>> | エラーを 指定されたファイルの内容に追加します。 |
2>&1 | エラーと成功の出力を 成功の出力ストリームに送ります。 |
3> | 警告を指定されたファイルに送信します |
3>> | 警告を 指定されたファイルの内容に付加します。 |
3>&1 | 警告と成功時の出力を 成功時の出力ストリームに送る |
4> | 冗長な出力を指定されたファイルに送る |
4>> | 冗長な出力を の内容に追加する |
4> | |
4>&1 | 冗長な出力と成功したときの出力を 成功したファイルに送信します。 |
5> | デバッグメッセージを指定したファイルに送信する |
5>> | デバッグメッセージを 指定されたファイルの内容に追記する |
5>&1 | デバッグ・メッセージと成功時の出力を 成功時の出力ストリームに送る |
6> | 情報メッセージを指定された ファイルに送る。 |
6>> | 情報メッセージを指定されたファイルの 内容に追加します。 |
6>&1 | 通知メッセージと成功 出力を成功出力ストリームに送ります。 |
*> | すべての出力タイプを指定されたファイルに送ります |
*>> | すべての出力タイプを 指定されたファイルの内容に適用します |
*>&1 | すべての出力タイプを成功した出力 ストリームに送ります |
しかしながら。 しかし、より高度なシナリオは、出力を Application Insights などに直接保存することです。 多くのケースでは、これはバズーカでハエを撃つようなものですが、大規模なデプロイメントの場合はどうでしょう。
- Author
- Recent Posts
彼は2004年から開発者であり(PHPとJavaから始めました)、MOSSの頃からSharePointを様々な形に変えてきました。 最近では、SharePointだけでなく、.NETプロジェクト、Azure、Office 365など、様々な分野で活躍しています。
このブログは、彼の個人的なプロフェッショナルブログです。
- ガイド。 ウイルス性のAADテナントを引き継いで殺すには? – 2021年3月24日
- PowerShell セッションでロードされたすべてのアセンブリをリストアップするには? – 2021年3月18日
- Of Course I Still #ValoLove You – March 15, 2021年