第21章パート1-オブジェクトの作成とオブジェクトを使用したデータの出力。 PowerShellの詳細-Don Jones、Richard Siddaway

この章では、PowerShellの「精神」、パイプライン処理におけるイデオロギーの理解を提供し、究極のプログラミングスタイルを理解するために不可欠です。



第21章出力用のオブジェクトの作成



この章の内容は次のとおりです。

結論の「客観化」

カスタムオブジェクトの作成(PoShでオブジェクトを正しく作成する方法に関する情報が含まれています)

プロパティコレクションを操作する



前の章では、簡単なスクリプトを作成して関数に変換する方法を示しました。 スクリプトと関数は1つのデータ型のみを出力する必要があることを強調します。前の簡単な例では、1つのデータのみを出力する1つのコマンドのみを使用しました。 しかし、いくつかのコマンドを実行し、それらの出力を結合し、この組み合わせを関数またはスクリプトの出力に与える必要がある状況にいることは確かです。 この章では、(カスタムオブジェクトのテキストで)オブジェクトを作成する主な目的は、複数のオブジェクトのデータを1つに結合し、スクリプトまたは関数の後続の出力にすることであることを示します。 リチャードは、ある会議で、PowerShellにSQLのUnionのように機能するコマンドがあるかどうかを質問したことを思い出します。 この章では、オブジェクトを操作するため、PowerShellに精通します。



21.1出力にオブジェクトがあるのはなぜですか?

PowerShellはオブジェクトのみを生成します。 スクリプトの出力で発生する可能性があるのはオブジェクトだけです(または、この時点からスクリプトに適用されるすべてのものに関する関数を関数に適用できます)。 単純なブール値のみを印刷する必要があるかもしれませんが、これもオブジェクトです。 日付はオブジェクトです。 文字列または文字はオブジェクトです。 プロセッサやサービスの詳細など、より複雑なデータはすべてオブジェクトとして表示されます。



余談:スクリプトからの本格的なオブジェクトではなく、行でデータを出力する人の数を引き続き確認します(トランスレーターに注意してください-つまり、データをコンマで区切られた文字列に連結します)。 そうしないでください。 常にオブジェクトを配布する必要があります。 それでもフォーラムで質問する方法がわからない場合は、オブジェクトの撤回について教えてください。



翻訳者からの挿入-上流階級のスタイルは古典的なプログラミング言語とは異なります;上流階級は管理、自動化、および「大規模ブロック管理」の言語です。 あなたは最大限のシンプルさと明快さのために努力する必要があります。 以前は、コマンドのテキスト出力を取得して解析しましたが、それは正しかったです。 優雅に、あなたはオブジェクトを作り、そのオブジェクトを操作します。 違いは大きいです。



例-netbiosを見て、いくつかのデータを分析する必要があります。 送信スタイルの下:

#   Function Get-NBTName { #     NBTSTAT,     $data=nbtstat /n | Select-String "<" | where {$_ -notmatch "__MSBROWSE__"} #      $lines=$data | foreach { $_.Line.Trim() } #         #          $lines | foreach { $temp=$_ -split "\s+" [PSCustomObject]@{ Name=$temp[0] NbtCode=$temp[1] Type=$temp[2] Status=$temp[3] } } }
      
      







次に、たとえば次のように、関数呼び出しを行い、ソートしてから自動フォーマットします。

 PS C:\> Get-NBTName | sort type | Format-Table –Autosize
      
      







出力では次のようになります。

 Name NbtCode Type Status ---- ------- ---- ------ MYCOMPANY <1E> GROUP Registered MYCOMPANY <00> GROUP Registered MYCOMPANY <1D> UNIQUE Registered CLIENT2 <00> UNIQUE Registered CLIENT2 <20> UNIQUE Registered
      
      





合計で、 Get-NBTName関数の出力で、転送、ソート、サンプリングなどが可能なオブジェクト %%の場合はありません。



議論することができます-それで、最初は解析がありました。 答えは、posikで1回解析することです。出力ラインツールからの入力で、コマンドラインで、各関数入力の出力で常に解析します。 nbtstatから出力を取得するたびに解析を実行し、それをpingに渡してから、たとえばtracertを実行するか、行を反復する必要があるたびに解析する必要があります。





オブジェクトは、PowerShellが理解して操作できる単なるデータ構造です。 開発者はこれを言う必要はありません。これについては説明しません。

カスタムオブジェクトを作成すると、主な原則に従うことができます-スクリプトまたは関数は、たとえば、いくつかの異なるWMI呼び出しに基づいて形成された1種類のオブジェクトのみを返す必要があります。 複数のソースからの情報を表示する必要がある場合、この情報を配置するオブジェクトを作成する必要があります。 レポート専用のスクリプトを作成してみましょう。内部で何もし​​たくないが、データを収集して渡すだけであると仮定します。

リスト21.1に示す4つのコマンドを使用します。 それぞれがコンピューターに関するデータを取得します( ローカルホストに制限されていますが、どのコンピューターでも動作します)。



ヒント:コンピューター名をパラメーターとして使用して関数を作成する場合は、 localhostまたは"。"ではなく、デフォルトで$ Env:COMPUTERNAMEを使用します マシン名が必要な場合があります。これは、環境変数からすぐに取得して、コードに追加の手順を保存できます。



この情報をすべて表示するのではなく、4つの結論のそれぞれの一部のみが必要です。 リスト21.1では、データを取得して変数に入れていますが、出力は生成しません。 これは不変のコードであり、さまざまな方法でオブジェクトをさらに作成します。



リスト21.1開始コマンド

 $os = Get-WmiObject –Class Win32_OperatingSystem –comp localhost $cs = Get-WmiObject –Class Win32_ComputerSystem –comp localhost $bios = Get-WmiObject –Class Win32_BIOS –comp localhost $proc = Get-WmiObject –Class Win32_Processor –comp localhost | Select –First 1
      
      





4つのチームの最後はわずかに異なります。 最初の3つはオペレーティングシステム、コンピューターシステム、およびBIOSです。これらは1つのインスタンスに定義により存在し、プロセッサーは複数の場合があります。 すべてのプロセッサが同じになるため、 Select –First 1を選択します。 Windows Server 2003およびWindows XPは、 Win32_Processorクラスの単一インスタンスをカーネルに返します。したがって、このクラスを使用した結果は、オペレーティングシステムのバージョンによって異なることに注意してください。



ご注意 この問題の修正は、 support.microsoft.com / kb / 932370の Windows Server 2003の修正プログラムで利用できます。この製品のライフサイクルの残り時間が限られているため、インストールするのが適切でない場合があります。



したがって、4つの変数にはそれぞれ1つのオブジェクトが含まれます。 これは、次に検討する手法にとって重要です。

ヒント。 PowerShell 3および4には、 WMIコマンドレットの代わりに共通情報モデル(CIM)コマンドレットを使用するオプションがあります。 この章の例では、WMIまたはCIMを介してデータを取得する方法は重要ではありません。



翻訳者挿入

WMIのないPowerShellは本格的ではありません。WMI(またはCIM)をコマンドのリモート実行と組み合わせて使用​​すると、posikのすべての能力が明らかになります。 Siddevayによると、管理者が送信を知っているがWMIを知らない場合、言語能力の最大60%を失います。 計算方法がわかりません。


したがって、変数はいっぱいです。コードに変数を埋め込む準備ができています。



継続



All Articles