PowerShell を知る

PowerShell は、コマンド ライン シェルとスクリプト言語が一体化されたものです。 PowerShell は Windows から始まりました。 管理タスクについてタスクの自動化を支援することを目的としていましたが、クロス プラットフォームとして拡張され、さまざまなタスクに使用できるようになりました。

PowerShell が他と違うのは、テキストではなく .NET オブジェクトを受け入れて返すことです。 これにより、"パイプライン" で、さまざまなコマンドを連続して簡単に接続できます。

そのような場合でも、結果を少し "マッサージ" (変換または操作) しなければならないことがあります。

PowerShell の用途

PowerShell の用途は、Windows 専用だった頃に比べて広がっています。 Windows タスクの自動化にも使用されますが、今日では、次のようなさまざまなタスクで使用できます。

  • クラウド管理。 PowerShell は、クラウドのリソースを管理するために使用できます。 たとえば、クラウドのリソースに関する情報を取得したり、新しいリソースを更新または配置したりできます。
  • CI/CD。 継続的インテグレーション/継続的配置パイプラインの一部として使用することもできます。
  • Active Directory と Exchange のタスクの自動化。 使用することで、Active Directory のユーザーや、Exchange のメールボックスの作成など、Windows でのほぼすべてのタスクを自動化できます。

用途の範囲は他にも多数ありますが、上記の一覧から PowerShell が長い歴史を経てきたことがわかります。

PowerShell を使用するユーザー

PowerShell は非常に強力であるため、さまざまな役割で働く多くの人が、使用によるベネフィットを得られます。 従来、PowerShell はシステム管理者ロールで使用されていましたが、現在は DevOps、Cloud Ops、さらには開発者も使用しています。

PowerShell コマンドレット

PowerShell には、何百ものコマンドがプレインストールされています。 PowerShell コマンドは cmdlet と呼ばれ、"コマンドレット" と発音します。

各コマンドレットの名前は、"動詞-名詞" のペアで構成されます。 たとえば、Get-Process のようにします。 この名前付け規則のおかげで、コマンドレットの動作を簡単に理解できます。 また、探しているコマンドを簡単に見つけられます。 使用するコマンドレットを検索するときは、動詞または名詞でフィルターできます。

コマンドレットを使用して PowerShell を探索する

PowerShell を初めて選択したときは、学習することが多く見えるため、難しいと思われるかもしれません。 PowerShell は、必要に応じて少しずつ学習できるように設計されています。

PowerShell には、PowerShell をよく知るのに役立つコマンドレットが含まれています。 これら 4 つのコマンドレットを使用して、使用可能なコマンド、実行内容、および操作の対象となる型を確認できます。

  • Get-Verb. このコマンドを実行すると、ほとんどのコマンドが従う動詞の一覧が返されます。 応答には、これらの動詞によって行われることの説明が含まれます。 ほとんどのコマンドがこの名前付け規則に従うため、コマンドの動作を予想できます。 これは、適切なコマンドを選んだり、自分でコマンドを作成する必要がある場合にコマンドの名前を付けるときに役立ちます。
  • Get-Command. このコマンドでは、コンピューターにインストールされているすべてのコマンドの一覧が取得されます。
  • Get-Member. オブジェクトベースの出力に対して動作し、コマンドで使用できるオブジェクト、プロパティ、およびメソッドを検出できます。
  • Get-Help. コマンドの名前を引数として指定してこのコマンドを呼び出すと、コマンドのさまざまな部分について説明するヘルプ ページが表示されます。

これらのコマンドを使用して、PowerShell について知る必要があるほとんどすべてのことを確認できます。

動詞

"動詞" は、PowerShell の重要な概念です。 これは、ほとんどのコマンドレットが従う名前付け基準です。 また、独自のコマンドを記述するときに従うことが期待されている名前付け基準でもあります。 "動詞" は、実行しようとしている内容 (データの読み取りや、データの変更など) を示しています。 PowerShell には、標準化された動詞の一覧があります。 使用可能なすべての動詞の完全な一覧を取得するには、Get-Verb コマンドレットを使用します。

Get-Verb

実行すると、動詞の長い一覧が出力されます。 その応答から、そのような動詞が何を行うかについて、さらなるコンテキストが表示されるということがわかります。 こちらが、出力の先頭行です。

Verb        AliasPrefix Group          Description
----        ----------- -----          -----------
Add         a           Common         Adds a resource to a container, or attaches an item to ano…

Get-Command を使用してコマンドを検索する

Get-Command コマンドレットでは、システムにインストールされている使用可能なすべてのコマンドの一覧が返されます。 ただし、返される一覧は非常に大きくなります。 コマンドを簡単に見つけられるように、返される情報の量を制限することができます。 応答をフィルターするには、いずれかのパラメーターを使用するか、ヘルパー コマンドレットを使用します。

名前でフィルターする

さまざまなパラメーターを使用して、Get-Command の出力をフィルターできます。 この方法でのフィルターは、コマンドの特定のプロパティに対してクエリを実行するということです。 つまり、フィルターの対象となるプロパティを指定し、照合する文字列を指定するということです。 したがって、次のような比較になります。

Get-Command -Name '*Process'

この時点で、フィルターでは指定された文字列引数と完全に一致するかどうかが試行されます。 より柔軟にする場合は、比較で、パターン マッチングを行うワイルドカード * を使用できます。 次のコードでは、名前が process で終わるすべてのコマンドが検索されます。

上記のパラメーター -Name はフィルターに使用されます。 -Name とは別に、-ParameterName-Type などにもフィルターを設定できます。

名詞と動詞に対するフィルター

-Name でのフィルターについて確認し、他にもフィルターを適用できるパラメーターがあることがわかりました。 動詞と名詞にも、フィルターを適用できます。 そのようなフィルターでは、コマンドの名前の一部が対象となります。

  • 動詞をフィルターする。 コマンドの名前の動詞部分は、左端の部分です。 コマンド Get-Process の動詞部分は Get です。 動詞部分をフィルターするには、次のように -Verb をパラメーターとして指定します。

    Get-Command -Verb 'Get'
    

    上記のコマンドでは、動詞部分が Get であるすべてのコマンドが一覧表示されます。

  • 名詞をフィルターする。 コマンドの右端の部分が、名詞部分です。 動詞は、Get-Verb の呼び出しから返された動詞の中にある必要があります。名詞は任意のものにすることができます。 コマンド Get-Process の、名詞部分は Process です。 名詞をフィルターするには、次のように -Noun をパラメーターと文字列引数として指定します。

    Get-Command -Noun U*
    

動詞 (または名詞) のみを使用してフィルターすると、やはり結果が大きくなる場合があります。 検索を絞り込むには、下の例のように 2 つのパラメーターを組み合わせることをお勧めします。

Get-Command -Verb Get -Noun U*

上記の結果は、次のようになります。

CommandType     Name                         Version    Source
-----------     ----                         -------    ------
Cmdlet          Get-UICulture                7.0.0.0    Microsoft.PowerShell.Utility
Cmdlet          Get-Unique                   7.0.0.0    Microsoft.PowerShell.Utility
Cmdlet          Get-Uptime                   7.0.0.0    Microsoft.PowerShell.Utility
Cmdlet          Get-UsageAggregates          2.0.0      Az.Billing

動詞とそれによって呼び出されるものを知ることで、出力がかなり絞り込まれました。

ヘルパー コマンドレットを使用して結果をフィルターする

パラメーターを使用してフィルターする以外に、コマンドを使用してこのタスクを実行することもできます。 フィルターとして機能するコマンドをいくつか次に示します。

  • Select-Object. これは、1 つまたは複数のオブジェクトから特定のプロパティを選択するのに役立つ、非常に汎用性の高いコマンドです。 さらに、そのパラメーターを使うと、返される応答を制限することもできます。 Select-Object を使用して限られた数のレコードを要求する場合の例を示します。

    Get-Command | Select-Object -First 3
    

    先頭からカウントされた最初の 3 つのコマンドが上記の結果になります。 結果は次のようになります。

    CommandType     Name                                               Version    Source
    -----------     ----                                               -------    ------
    Alias           Add-AdlAnalyticsDataSource                         1.0.2      Az.DataLakeAnalytics
    Alias           Add-AdlAnalyticsFirewallRule                       1.0.2      Az.DataLakeAnalytics
    Alias           Add-AdlStoreFirewallRule                           1.3.0      Az.DataLakeStore
    

    このコマンドでは他にも多くのことができるので、さらに詳しく調べる価値があります (Select-Object のドキュメント)

  • Where-Object. Where-Object は、プロパティの値に基づいてコレクションからオブジェクトを選択する場合に役立ちます。 コマンドは式を受け取り、そこでは、どの列をどの値と照合するかを表現できます。 ProcessNamep で始まるすべてのプロセス オブジェクトを検索するには、Where-Object を次のように使用することができます。

    Get-Process | Where-Object {$_.ProcessName -like "p*"}
    

    上記の Get-Process コマンドレットでは、プロセス オブジェクトのコレクションが生成されます。 応答をフィルターするには、コマンド Where-Object を "パイプ" します。 パイプは、2 つ以上のコマンドがパイプ文字 | を介して接続されることを意味します。 1 つのコマンドからの出力が、左から右に読み取られるときに、次のコマンドの入力として機能するということです。 Where-Object では、フィルターに式が使用されます。 式では、-like 演算子と、ワイルドカード式を含む文字列引数が使われます。

Get-Member を使用してオブジェクトを探索する

必要なコマンドレットを見つけたら、何が出力されるかについて詳しく確認してみましょう。 出力は、次のようないくつかの理由で興味深いものです。

  • スタンドアロン。 1 つのコマンドレットを実行するだけで、出力を何らかの種類のレポートに表示することができます。 自分にとって意味のある出力をコマンドが生成するかどうか、またはそれを変更する必要があるかどうかをご確認ください。
  • パイプラインで使用される場合。 多くの場合、PowerShell では、パイプライン内の複数のコマンドを接続して、データをフェッチし、フィルターして、最終的に変換することができます。 コマンドがパイプラインに適合するようにするには、どのような入力と出力が生成されるかを確認する必要があります。 これは、コマンドの出力が別のコマンドの入力として使用されることを意味します。

Get-Member コマンドレットでは、結果オブジェクトの型、プロパティ、メソッドが表示されます。 検査する出力を Get-Member にパイプします。

Get-Process | Get-Member

結果には、TypeName として戻り値の型と、オブジェクトのすべてのプロパティとメソッドが表示されます。 このような結果の抜粋を次に示します。

TypeName: System.Diagnostics.Process

Name        MemberType     Definition
----        ----------     ----------
Handles     AliasProperty  Handles = Handlecount
Name        AliasProperty  Name = ProcessName

通常、オブジェクトには数多くのプロパティとメソッドがあり、探しているものを簡単に見つけられるように、結果をフィルターできます。 パラメーター -MemberType を使用して、たとえば、次の例のように、すべてのメソッドが表示されるように指定できます。

Get-Process | Get-Member -MemberType Method

応答が返された場合、PowerShell は通常、一部のプロパティのみを表示します。 上記の応答では NameMemberTypeDefinition が表示されました。 この表示を変更するには、コマンドレット Select-Object を選択できます。 Select-Object では表示する列を指定できます。 これには、列の名前、コンマ区切りのリスト、またはワイルドカード * を指定できます。 Select-Object を使用して NameDefinition を取得する例を示します。

Get-Process | Get-Member | Select-Object Name, Definition

型で検索する

目的のコマンドを検索する別の方法として、同じ型に対して動作するすべてのコマンドを検索する方法もあります。 Get-Member を使用すると、次のように、戻り値の型が応答の最初の行として取得されます。

TypeName: System.Diagnostics.Process

この型を使用して、次のようにコマンドを検索できるようになりました。

Get-Command -ParameterType Process

上記を呼び出した結果のリストには、Process 型に対してのみ動作するコマンドが含まれます。

CommandType     Name                         Version    Source
-----------     ----                         -------    ------
Cmdlet          Debug-Process                7.0.0.0    Microsoft.PowerShell.Managem…
Cmdlet          Enter-PSHostProcess          7.1.0.0    Microsoft.PowerShell.Core
Cmdlet          Get-Process                  7.0.0.0    Microsoft.PowerShell.Managem…
Cmdlet          Get-PSHostProcessInfo        7.1.0.0    Microsoft.PowerShell.Core
Cmdlet          Stop-Process                 7.0.0.0    Microsoft.PowerShell.Managem…
Cmdlet          Wait-Process                 7.0.0.0    Microsoft.PowerShell.Managem…

ご覧のように、コマンドの種類を知っておくと、興味深いコマンドの後に検索を大幅に絞り込むことができます。

演習 - 最初のコマンドの呼び出し

この演習では、最初のコマンドを実行する方法について学習します。

  1. pwsh と入力して、PowerShell コンソールを起動します。

    pwsh
    
  2. 次の $PSVersionTable.PSVersion を実行します。

    $PSVersionTable.PSVersion
    

    出力の例を次に示します。

    Major  Minor  Patch  PreReleaseLabel BuildLabel
    -----  -----  -----  --------------- ----------
    7      1      0
    

    おめでとうございます。これで、最初のコマンドを正常に実行し、システムにインストールされている PowerShell のバージョンに関する情報を取得できるようになりました。

この演習の目標は、コマンドについて詳しく理解することです。 これにより、操作対象の型や、同じ型に対して実行される他の類似するコマンドなどもわかります。

  1. PowerShell シェルが確実に開始されているようにします

  2. コマンド Get-Process を実行します。

    Get-Process | Get-Member | Select-Object TypeName -Unique
    

    次のような内容が出力されます。

    TypeName
    --------
    System.Diagnostics.Process
    --------
    

    戻り値は、コマンド Get-Command によって返される型です。 この時点で、他にどのようなコマンドがこれらの型に対して動作するかを確認できます。

  3. コマンド Get-Command を実行します。

    Get-Command -ParameterType Process
    

    次のような内容が出力されます。

    CommandType     Name                         Version    Source
     -----------     ----                        -------    ------
     Cmdlet          Debug-Process               7.0.0.0    Microsoft.PowerShell.Managem…
     Cmdlet          Enter-PSHostProcess         7.1.0.0    Microsoft.PowerShell.Core
     Cmdlet          Get-Process                 7.0.0.0    Microsoft.PowerShell.Managem…
     Cmdlet          Get-PSHostProcessInfo       7.1.0.0    Microsoft.PowerShell.Core
     Cmdlet          Stop-Process                7.0.0.0    Microsoft.PowerShell.Managem…
     Cmdlet          Wait-Process                7.0.0.0    Microsoft.PowerShell.Managem…
    

    これで、同じ型 Process で動作する他のコマンドがわかりました。 最初に Get-Member から始めると、次にどのコマンドについて確認すべきかを理解できるでしょう。

まとめ

この最初のパートでは、PowerShell の概要と、使用できる範囲について学習しました。 コマンドレット、特に Get-CommandGet-VerbGet-Member について学習しました。 これらのコマンドレットから学習方法がわかるため、知っておくことが重要です。 次のパートでは、強力なヘルプ システムの使用方法について説明します。

その他のリソース