SAPIEN Technologies (日本語)
Windows PowerShellコンソール用のスクリプトを長年にわたって作成した後、Windows PowerShellコマンドを実行するGUIアプリケーションを作成する次のレベルの自動化について学んでいます。 PowerShell Studio formsは、GUIアプリケーションの優しくガイド付きの紹介を提供しますが、古い習慣を破るにはまだ時間がかかりました。
私は常に、コンソールで”ちょうどうまくいく”ものがGUIでは意味をなさないことを自分自身に思い出させる必要があります。 書き込み出力もその一つです。,
コンソールへの出力の書き込み
Windows PowerShellコンソールで出力を生成すると、出力はコンソールウィンドウにテキスト文字列として表示されます。
PS C:> Get-DateWednesday, December 3, 2014 7:16:38 AM
舞台裏では、Windows PowerShellはout-Stringコマンドをパイプラインにサイレントに追加し、結果を”標準出力”(”stdout”)に送信します。 のプロセスのホストWindows PowerShellの標準出力では、ほとんどを書き込むことによって、出力のコンソール(ホストの挙動が異なります).,
したがって、Get-Processコマンドレットなどのオブジェクトを返すコマンドレットを実行すると、オブジェクト(の文字列表現)がコンソールに表示されます。
Format-ListやFormat-Tableなどを使用してオブジェクトを書式設定すると、書式設定されたオブジェクトの文字列表現がコンソールに表示されます。Write-HostまたはWrite-Output、Out-HostまたはOut-Stringを実行すると、出力文字列がコンソールに表示されます。また、Write-Warning、Write-Verbose、またはWrite-Errorを使用して出力を代替出力ストリームに送信した場合でも、デフォルトでは出力はコンソールに表示されます。,
しかし、GUIアプリケーションにはコンソールがありません。 コンソールがないときにコンソールに行く出力はどうなりますか? そして、もっと重要なのは、コンソールなしで出力を管理する方法ですか?
私の出力はどこですか?
PowerShell Studioで作成したクールなGUIアプリケーションのように、コンソールがありません。 標準出力はありません。 自動追加されたOut-Stringはありません。したがって、出力を生成し、それをファイルまたは変数に保存しないと、出力は失われるだけです。,
Get-Process | ... <Nowhere> ...
フィールドにキャッチャーがいないときに野球を投げる投手のようなものです。 ボールはちょうど地面に落ち、停止にロールバックします。. 無視される。
したがって、GUIアプリケーションでは、出力を書くだけではなく、最高のものを期待することはできません。 コマンドレットの出力を表示したり保存したりする場合は、明示的に行う必要があります。
テキストボックスに出力を表示する
GUIアプリケーションは、コントロールの集合です。 出力を表示す,
たとえば、コンソールにローカルコンピューターの名前を表示するには、$env:ComputerNameコマンドを実行します。
PS C:> $env:ComputerNameJUNEB-TESTBOX
コンソールがないGUIアプリケーションで同じことを試しても、結果はまったく表示されません。 この例では、クリックすると$env:ComputerName式を実行するボタンを持つフォームを作成しました。,
$buttonComputerName_Click={<b>$env:コンピュータ名</b>}
しかし、ボタンをクリックしても、コンソールウィンドウが開いていても何も起こりません。
GUIアプリケーションでコンピュータ名を表示するには、フォームに表示コントロールを追加し、コマンドの出力を表示コントロールのメソッドに割,たとえば、Textboxコントロールをフォームに追加し、代入演算子(=)を使用して、式の結果をTextBoxのTextプロパティに割り当てることができます。 これで、ボタンをクリックすると、TextBoxに出力が表示されます。
$buttonComputerName_Click={$textboxResults.Text=$env:ComputerName}
結果は次のとおりです。
別のプログラムで出力を表示
プログラムの一部ではないオブジェクトでコマンドの出力を表示することもできます。, GUIプロがこのアプローチが雑にない最高の練習で入手できるかもしれませんが、見に役立てたいとのお気持ちから試験またはデバッグしやすくなります。
たとえば、出力をOut-GridViewコマンドレットにパイプ処理できます。
$buttonComputerName_Click={$env:ComputerName|Out-GridView}
結果は次のとおりです。
ファイルに書き込んでファイルを開くこともできます。 これらのサンプルコマンドを一時ファイルのファイルへの書き込み、次に利用メモ帳を表示すファイルです。, この実現プログラマが流石にすることが明らかに、少なくとも試験をします。
結果は次のとおりです。
文字列に変換
GUIアプリケーションで管理する必要がある別のタスクは、オブジェクトをテキスト文字列に変換することです。 通常、これは出力をOut-StringなどのOutコマンドレットにパイプすることを意味します。 Out-GridViewなどのコマンドレットは、オブジェクトを文字列データに変換します。
コンソールに出力を書き込むと、Windows PowerShellは自動的にパイプラインにOut-Stringコマンドを追加します。, しかし、GUIアプリケーションにはコンソールと自動Out-Stringはありません。
stringオブジェクトまたはTextBoxなどのstringオブジェクトを受け取るコントロールに非stringオブジェクトを割り当てると、Windows PowerShellはそのオブジェクトのtoString()メソッド (他の言語では、割り当ては失敗しますが、それは助けようとしています。 DateTimeやErrorRecordオブジェクトなどのいくつかのオブジェクトでは、toString()は正常に動作しますが、多くの場合、奇妙な結果が生成されます。
たとえば、このコマンドはGet-Processコマンドの結果をテキストボックスに割り当てます。, Windows PowerShellはテキストが必要であることを認識し、ProcessオブジェクトのtoString()メソッドを呼び出しますが、結果は役に立ちません。
$buttonGetProcess_Click={$textboxResults.Text=Get-Process}
既定のプロセステーブルの文字列表現を取得するには、出力をOut-Stringコマンドレットにパイプし、テキストボックスに割り当てます。
$buttonGetProcess_Click={$textboxResults.,Text=Get-Process/Out-String}
ヒント:出力を読みやすくするには、テキストボックス(またはリッチテキストボックス)を等幅フォントを使用するように設定します。 にはPowerShellスタジオを右クリックし、テキストボックスをクリック用のプロパティセットしたら、適用をクリックしますコンソールの商標または登録商標です。
toString()を完全に避けないでください。 ToString()メソッドが有用な結果を生成するオブジェクトがいくつかあります。 DateTimeオブジェクトは古典的な例です。 DateTimeオブジェクトのtoString()メソッドは、”短い日付/長い時間”書式文字列を返します。 Out-Stringは”長い日付/長い時間”形式を返します。,
PS C:> (Get-Date).ToString()12/6/2014 10:42:24 AMPS C:> Get-Date | Out-StringSaturday, December 6, 2014 10:42:37 AM
#toString()を使用します$buttonGetDate_Click={$textboxDate.Text=Get-Date}
#toString()を使用します$buttonGetDate_Click={$textboxDate.Text=Get-Date|Out-String}
Get-DateコマンドレットのFormatパラメーターとUFormatパラメーターを使用して、ほぼすべての構成で書式設定された日付文字列を取得することもできます。, たとえば、RFC1123形式の日付を取得するには、-Format R(または”r”)を使用します。 必要なパイプにかかる取得分を含めた文字列を使用形式またはUFormatので、これらのパラメータのcmdletを返す文字列です。
PS C:> Get-Date -Format RTue, 09 Dec 2014 10:46:41 GMT
書式設定されたオブジェクトの変換
コンソールでは、通常、Format-Tableなどの書式コマンドレットがパイプラインの最後の要素 Windows PowerShellは、コンソールに送信する前にパイプラインにOut-Stringコマンドを追加するため、コンソールでの出力は素晴らしいものになります。,
ただし、GUIアプリケーションでは、既定では、Formatコマンドレットが返すformatオブジェクトのtoString()メソッドを呼び出した結果が取得されます。
$buttonGetHotfix_Click={$textboxHotFix.Text=Get-HotFix|Format-Table-Property HotFixID,InstalledOn-AutoSize}
GUIアプリケーションでより使いやすい表示を得るには、textboxのTextプロパティに割り当てる前に、formatオブジェクトをOut-Stringコマ,
それは良いです!
しばらくすると、GUIアプリケーションで出力表示を管理するタスクは、コマンドレット名を入力するのと同じくらい自然になりますが、学習中は、必ずテストして、すべての出力がキャプチャされ、使用可能な形式で表示されることを確認してください。
June BlenderはSAPIEN Technologies,Inc.のテクノロジーエバンジェリストです。 きゃ[email protected] または女のTwitterで@juneb_get_help.