前回に引き続きMicrosoftが提供している新しいシェル、Windows Power Shellの基本操作方法を学びます。基本操作編第2弾の今回は、パイプの使用方法を中心としたコマンドレットの操作方法を学びます。
前回の予告で、次回はスクリプトの説明を行うと書いたのですが、もう少しコマンドレット操作についての解説を行い、PowerShellの理解を深めてもらいたいと考えました。その上で、次回スクリプトの説明を行いたいと思います。スクリプトの説明を期待していた方には申し訳ありませんが、ご理解いただけると助かります。
今回は、パイプを中心にコマンドレットの使用方法を説明します。
はじめにGet-Dateコマンドレットを紹介しましょう。
このコマンドレットは、現在の日付と時刻を取得します(Get-Dateの使用方法を確認したい場合は、Get-Help Get-Dateと入力してください。詳しくは前回の記事を参照してください)。
コンソールウィンドウで、
Get-Dateと入力しEnterキーを押します。
現在の日時が表示されました。
実は、Get-Dateコマンドレットは日時の文字を表示しているのではなく、.NET FrameworkのオブジェクトであるSystem.DateTimeを取得し、規定値である現在日時を表示しています。そのほかのコマンドレットも同様に.NET Frameworkのオブジェクトを返します。
ここで本当に.NET Frameworkのオブジェクトが返されるのか実験をしてみましょう。まずは、
(Get-Date).GetType()と入力してみてください。
Name列にDateTimeと表示されています。これで.NET FrameworkのオブジェクトであるSystem.DateTimeであることが確認できました。
さて、コマンドレットの実行結果は.NET Frameworkのオブジェクトであることがわかりました。ということは、そのほかのDateTimeオブジェクトが持つメンバーにもアクセスが可能だということです。
Microsoft Visual Studioがインストールされている方はSystem.DateTimeのヘルプを参照してみてください。インストールされていない方はオンラインのMSDNライブラリにあるSystem.DateTimeで確認してみてください。
どうでしょう? System.DateTime1つとってもこれだけの多くのメンバーにアクセス可能です。試しにYearプロパティにアクセスしてみましょう。コンソールウィンドウで、
(Get-Date).Yearと入力して、Enterキーを押してみてください。現在の年を取得することができます。
このようにコマンドレットは.NET Frameworkオブジェクトを返すということを覚えておくとよいでしょう。
PowerShellを使用していく上で、パイプラインは欠かせない機能の1つです。パイプライン(以下パイプ)とは|であらわし、コマンドの実行結果を次のコマンドの入力へと引き渡します。
Get-Memberコマンドレットを使用しながら、パイプの機能を見てみましょう。まず、Get-Memberコマンドレットですが、オブジェクトが持つメンバー情報を取得する機能を持ちます。
先ほど使用したGet-Dateコマンドレットが返すオブジェクトのメンバー情報を取得してみましょう。コンソールウィンドウに、
Get-Date | Get-Memberと入力しEnterキーを押してください。これはGet-Dateコマンドレットの結果をパイプでGet-Memberコマンドレットに引き渡すことを意味しています。
Get-Dateコマンドレットが返すSystem.DateTimeオブジェクトのメソッドとプロパティの一覧を確認することができました。これは、Get-Dateコマンドレットが返すSyste.DateTimeオブジェクトがパイプを流れ、Get-Memberプロパティに渡されたからです。
このようにパイプにはオブジェクトが流れます。
Get-Memberコマンドレット せっかくなのでGet-Memberの使用方法を少し紹介します。 Get-Memberコマンドレットは、 -MemberTypeパラメータを使用すると、パイプで受け取ったオブジェクトが持つメソッドのみ表示したり、プロパティのみを表示したりすることが可能です。 メソッドのみを表示させる場合は、 Get-Date | Get-Member -MemberType Method プロパティのみを表示するには、 Get-Date | Get-Member -MemberType Property のように入力します。 パイプラインについて理解ができると、使用できるコマンドレットの幅が広がります。ぜひ、ほかのコマンドレットでも試してみてください。PowerShellでは、パイプを通して受け取ったオブジェクトを並べ替えるためSort-Objectコマンドレットがあります。ここでは最新のシステムイベント10件を取得し、EventIDで並べ替えを行ってみましょう。
まずイベントの取得ですが、Get-EventLogコマンドレットを使用します。Get-EventLogコマンドレットには-logNameというパラメータがあります。このパラメータのあとにsystemと記述するとシステムイベントを取得できます。また、applicationと記述するとアプリケーションイベントを取得することができます。
「最新の10件」は-newestパラメータを使用します。-newestのあとに10と書くことで最新の10件のデータを取得することができます。
まずはここまでのコマンドレット(並べ替えの操作なしの)を実行してみましょう。
Get-EventLog -logName system -newest 10と入力しEnterキーを押してください。
システムログの最新の10件は取得できましたか?
では、この取得結果をeventID順に並べ替えてみましょう。先ほど説明したように並べ替えにはSort-Objectコマンドレットを使用するのですが、このコマンドレットへはパイプを流れてきたオブジェクトを並べ替えるので、次のような記述をするのが一般的です。
Get-EventLog -logName system -newest 10 | Sort-Object eventIDと入力しEnterキーを押してください。
実行結果を見るとわかるとおり昇順での並べ替えです。降順で並べ替えを行うには-descendingパラメータを付加します。
(実際には1行) Get-EventLog -logName system -newest 10 | Sort-Object eventID -descendingSelect-Objectコマンドレットを使用すると、特定のプロパティのみを抜き出すことができます。
Get-ChildItemコマンドレットを実行するとMode、LastWriteTime、Length、Nameプロパティが表示されるのですが、Select-Objectコマンドレットを使用してNameプロパティとLengthプロパティのみを取得してみましょう。
Get-ChildItem *.* | Select-Object Name, Lengthと入力しEnterキーを押してください。
NameプロパティとLengthプロパティだけを表示することができたと思います。
今度は、Select-Objectコマンドレットと、先ほど使用したSort-Objectをあわせて使用してみましょう。NameプロパティとLengthプロパティを取得し、Lengthプロパティで並べ替えを行ってみたいと思います。
Get-ChildItem *.* | Select-Object Name, Length | Sort-Object Lengthと入力してEnterキーを押してください。
パイプの数が2つになりましたが、1つずつ区切って考えると簡単です。
*.*のファイル情報取得 | ファイル情報の中のNameとLengthを取得 | Lengthで並べ替えこのようにパイプごとに処理を区切って考えることがポイントです。
先ほどのSelect-Objectコマンドレットは、列データを取得するイメージでした。今度は特定条件に合致するデータを行で取得するコマンドレット、Where-Objectについて説明します。
ローカルコンピュータ上のサービスを取得するコマンドレットとしてGet-Serviceがあります。まずはこのコマンドレットを実行してみましょう。
Get-Serviceと入力してEnterキーを押してください。
稼働中のサービス、停止中のサービスを取得できます。
このとき「停止中のサービスだけを表示したい」となった場合はどうすればよいでしょう? こういう場合は、特定の条件に合致するデータを取得できるWhere-Objectコマンドレットを使用します。
get-service | Where-Object {$_.Status -eq "Stopped"}と入力して、Enterキーを押してください。
停止中のサービスを取得できました。
Where-Objectコマンドレットでは条件式を{}で囲まれた部分に記述します(これをスクリプトブロックと呼びます)。また$_はパイプで渡されたオブジェクトが格納される特殊な変数です。この変数にドットを付けて$_.Statusのように記述すると、パイプで渡されたオブジェクトの「Statusプロパティ」を意味することとなります。-eqは比較演算子で「等しい」という意味です。
つまりWhere-Object {$_.Status -eq "Stopped"}は、パイプで渡されたオブジェクトのStatusプロパティが「Stopped」に等しいものだけを返します。
同じプロパティの値を持つオブジェクトでグルーピングをするコマンドレットとして、Group-Objectがあります。
例えば、指定したディレクトリにあるファイル群を拡張子別にグルーピングするには、
Get-ChildItem *.* | Group-Object Extensionと入力してEnterキーを押します。
拡張子別にデータがグルーピングされ、グループごとのファイル数や拡張子、グループ化されたファイル名が表示されています。
今回は、
コマンドレットの実行結果はオブジェクトであることパイプSort-ObjectSelect-ObjectWhere-ObjectGroup-Objectについて見てきました。Windows PowerShellが強力であることを少しでも実感していただけたでしょうか?
次回は、お約束通りスクリプトについて説明したいと思います。
转载于:https://www.cnblogs.com/c-x-a/p/4488045.html
相关资源:JAVA上百实例源码以及开源项目