第 5 章 - 書式設定、エイリアス、プロバイダー、比較

要件

この章で紹介する例の中には、SQL Server PowerShell モジュールを必要とするものがいくつかあります。 このモジュールは、SQL Server Management Studio (SSMS) の一部としてインストールされます。 このモジュールは、以降の章でも使用されるので、 Windows 10 ラボ環境のコンピューターにダウンロードし、インストールしてください。

右で書式設定

第 4 章では、できるだけ左端でフィルター処理する方法について学習しました。 コマンドの出力を手動で書式設定するためのルールは、このルールに似ています (できるだけ右で実行する必要がある場合を除く)。

最も一般的な書式設定コマンドは Format-TableFormat-List です。 Format-WideFormat-Custom を使用することもできますが、あまり一般的ではありません。

第 3 章で説明したように、カスタム書式設定を使用しない限り、4 つを超えるプロパティを返すコマンドは既定でリストになります。

Get-Service -Name w32time | Select-Object -Property Status, DisplayName, Can*
Status              : Running
DisplayName         : Windows Time
CanPauseAndContinue : False
CanShutdown         : True
CanStop             : True

Format-Table コマンドレットを使用して書式設定を手動でオーバーライドし、リストではなくテーブルに出力を表示します。

Get-Service -Name w32time | Select-Object -Property Status, DisplayName, Can* |
Format-Table
 Status DisplayName  CanPauseAndContinue CanShutdown CanStop
 ------ -----------  ------------------- ----------- -------
Running Windows Time               False        True    True

Get-Service の既定の出力は、テーブル内の 3 つのプロパティです。

Get-Service -Name w32time
Status   Name               DisplayName
------   ----               -----------
Running  w32time            Windows Time

Format-List コマンドレットを使用して既定の書式設定をオーバーライドし、結果をリストで返します。

Get-Service -Name w32time | Format-List
Name                : w32time
DisplayName         : Windows Time
Status              : Running
DependentServices   : {}
ServicesDependedOn  : {}
CanPauseAndContinue : False
CanShutdown         : True
CanStop             : True
ServiceType         : Win32ShareProcess

Get-ServiceFormat-List にパイプ処理するだけで、追加のプロパティが返されることに注意してください。 その特定のコマンドについては書式設定がバックグラウンドで行われるため、これはすべてのコマンドで発生するわけではありません。

書式設定コマンドレットを使うときに最も注意しなければならないのは、このコマンドレットによって生成される書式設定オブジェクトは、PowerShell の通常のオブジェクトと異なるという点です。

Get-Service -Name w32time | Format-List | Get-Member
   TypeName: Microsoft.PowerShell.Commands.Internal.Format.FormatStartData

Name                                    MemberType Definition
----                                    ---------- ----------
Equals                                  Method     bool Equals(System.Object obj)
GetHashCode                             Method     int GetHashCode()
GetType                                 Method     type GetType()
ToString                                Method     string ToString()
autosizeInfo                            Property   Microsoft.PowerShell.Commands.Inter...
ClassId2e4f51ef21dd47e99d3c952918aff9cd Property   string ClassId2e4f51ef21dd47e99d3c9...
groupingEntry                           Property   Microsoft.PowerShell.Commands.Inter...
pageFooterEntry                         Property   Microsoft.PowerShell.Commands.Inter...
pageHeaderEntry                         Property   Microsoft.PowerShell.Commands.Inter...
shapeInfo                               Property   Microsoft.PowerShell.Commands.Inter...

   TypeName: Microsoft.PowerShell.Commands.Internal.Format.GroupStartData

Name                                    MemberType Definition
----                                    ---------- ----------
Equals                                  Method     bool Equals(System.Object obj)
GetHashCode                             Method     int GetHashCode()
GetType                                 Method     type GetType()
ToString                                Method     string ToString()
ClassId2e4f51ef21dd47e99d3c952918aff9cd Property   string ClassId2e4f51ef21dd47e99d3c9...
groupingEntry                           Property   Microsoft.PowerShell.Commands.Inter...
shapeInfo                               Property   Microsoft.PowerShell.Commands.Inter...

   TypeName: Microsoft.PowerShell.Commands.Internal.Format.FormatEntryData

Name                                    MemberType Definition
----                                    ---------- ----------
Equals                                  Method     bool Equals(System.Object obj)
GetHashCode                             Method     int GetHashCode()
GetType                                 Method     type GetType()
ToString                                Method     string ToString()
ClassId2e4f51ef21dd47e99d3c952918aff9cd Property   string ClassId2e4f51ef21dd47e99d3c9...
formatEntryInfo                         Property   Microsoft.PowerShell.Commands.Inter...
outOfBand                               Property   bool outOfBand {get;set;}
writeStream                             Property   Microsoft.PowerShell.Commands.Inter...

   TypeName: Microsoft.PowerShell.Commands.Internal.Format.GroupEndData

Name                                    MemberType Definition
----                                    ---------- ----------
Equals                                  Method     bool Equals(System.Object obj)
GetHashCode                             Method     int GetHashCode()
GetType                                 Method     type GetType()
ToString                                Method     string ToString()
ClassId2e4f51ef21dd47e99d3c952918aff9cd Property   string ClassId2e4f51ef21dd47e99d3c9...
groupingEntry                           Property   Microsoft.PowerShell.Commands.Inter...

   TypeName: Microsoft.PowerShell.Commands.Internal.Format.FormatEndData

Name                                    MemberType Definition
----                                    ---------- ----------
Equals                                  Method     bool Equals(System.Object obj)
GetHashCode                             Method     int GetHashCode()
GetType                                 Method     type GetType()
ToString                                Method     string ToString()
ClassId2e4f51ef21dd47e99d3c952918aff9cd Property   string ClassId2e4f51ef21dd47e99d3c9...
groupingEntry                           Property   Microsoft.PowerShell.Commands.Inter...

つまり、書式設定コマンドのパイプ処理の対象となるコマンドは、それほどありません。 一部の Out-* コマンドに対してはパイプ処理できますが、それが限度です。 行の最後で書式設定 (右で書式設定) する必要があるのは、そのためです。

Aliases

PowerShell のエイリアスは、短いコマンド名です。 PowerShell には、一連の組み込みエイリアスが含まれていますが、独自のエイリアスを定義することもできます。

Get-Alias コマンドレットは、エイリアスを見つけるときに使用します。 コマンドのエイリアスが既にわかっている場合は、Name パラメーターを使用して、エイリアスが関連付けられているコマンドを確認します。

Get-Alias -Name gcm
CommandType     Name                                               Version    Source
-----------     ----                                               -------    ------
Alias           gcm -> Get-Command

Name パラメーターの値には、複数のエイリアスを指定できます。

Get-Alias -Name gcm, gm
CommandType     Name                                               Version    Source
-----------     ----                                               -------    ------
Alias           gcm -> Get-Command
Alias           gm -> Get-Member

Name パラメーターは位置指定パラメーターであるため、省略されていることがよくあります。

Get-Alias gm
CommandType     Name                                               Version    Source
-----------     ----                                               -------    ------
Alias           gm -> Get-Member

コマンドのエイリアスを検索する場合は、Definition パラメーターを使用する必要があります。

Get-Alias -Definition Get-Command, Get-Member
CommandType     Name                                               Version    Source
-----------     ----                                               -------    ------
Alias           gcm -> Get-Command
Alias           gm -> Get-Member

Definition パラメーターは位置指定には使用できないため、必ず指定する必要があります。

エイリアスを使用すると、キーストロークをいくつか省略できるため、コンソールにコマンドを入力するときは便利です。 このエイリアスは、保存するスクリプトや他のユーザーと共有するコードでは使用しないでください。 本書で前述したように、完全なコマンドレットとパラメーター名を使用すると自己文書化されるため、理解しやすくなります。

独自のエイリアスは、お使いのコンピューター上の現在の PowerShell セッションにしか存在しないため、作成するときは注意が必要です。

プロバイダー

PowerShell のプロバイダーは、データストアに、ファイル システムのようにアクセスできるようにするインターフェイスです。 PowerShell には、組み込みプロバイダーが複数用意されています。

Get-PSProvider
Name                 Capabilities                       Drives
----                 ------------                       ------
Registry             ShouldProcess, Transactions        {HKLM, HKCU}
Alias                ShouldProcess                      {Alias}
Environment          ShouldProcess                      {Env}
FileSystem           Filter, ShouldProcess, Credentials {C, A, D}
Function             ShouldProcess                      {Function}
Variable             ShouldProcess                      {Variable}
Certificate          ShouldProcess                      {Cert}
WSMan                Credentials                        {WSMan}

上記の結果が示すように、レジストリ、エイリアス、環境変数、ファイル システム、関数、変数、証明書、および WSMan に対して、組み込みプロバイダーが用意されています。

これらのプロバイダーがデータストアの公開に使用する実際のドライブは、Get-PSDrive コマンドレットを使って確認できます。 Get-PSDrive コマンドレットによって表示されるのは、プロバイダーが公開しているドライブだけではありません。ネットワーク共有にマップされたドライブなど、Windows 論理ドライブも表示されます。

Get-PSDrive
Name           Used (GB)     Free (GB) Provider      Root
----           ---------     --------- --------      ----
A                                      FileSystem    A:\
Alias                                  Alias
C                  14.41        112.10 FileSystem    C:\
Cert                                   Certificate   \
D                                      FileSystem    D:\
Env                                    Environment
Function                               Function
HKCU                                   Registry      HKEY_CURRENT_USER
HKLM                                   Registry      HKEY_LOCAL_MACHINE
Variable                               Variable
WSMan                                  WSMan

Active Directory PowerShell モジュール、SQLServer PowerShell モジュールといったサードパーティ モジュールそれぞれによって、独自の PowerShell プロバイダーと PSDrive が追加されます。

Active Directory PowerShell モジュールと SQL Server PowerShell モジュールをインポートします。

Import-Module -Name ActiveDirectory, SQLServer

追加 PowerShell プロバイダーが追加されたかどうかを確認します。

Get-PSProvider
Name                 Capabilities                       Drives
----                 ------------                       ------
Registry             ShouldProcess, Transactions        {HKLM, HKCU}
Alias                ShouldProcess                      {Alias}
Environment          ShouldProcess                      {Env}
FileSystem           Filter, ShouldProcess, Credentials {C, A, D}
Function             ShouldProcess                      {Function}
Variable             ShouldProcess                      {Variable}
ActiveDirectory      Include, Exclude, Filter, Shoul... {AD}
SqlServer            Credentials                        {SQLSERVER}

この結果セットでは、2 つの PowerShell プロバイダーが新しく存在していることに注意してください。1 つは Active Directory 用、もう 1 つは SQL Server 用のプロバイダーです。

各モジュールの PSDrive も追加されました。

Get-PSDrive
Name           Used (GB)     Free (GB) Provider      Root
----           ---------     --------- --------      ----
A                                      FileSystem    A:\
AD                                     ActiveDire... //RootDSE/
Alias                                  Alias
C                  19.38        107.13 FileSystem    C:\
Cert                                   Certificate   \
D                                      FileSystem    D:\
Env                                    Environment
Function                               Function
HKCU                                   Registry      HKEY_CURRENT_USER
HKLM                                   Registry      HKEY_LOCAL_MACHINE
SQLSERVER                              SqlServer     SQLSERVER:\
Variable                               Variable
WSMan                                  WSMan

PSDrives には、従来のファイル システムと同じようにアクセスできます。

Get-ChildItem -Path Cert:\LocalMachine\CA
   PSParentPath: Microsoft.PowerShell.Security\Certificate::LocalMachine\CA

Thumbprint                                Subject
----------                                -------
FEE449EE0E3965A5246F000E87FDE2A065FD89D4  CN=Root Agency
D559A586669B08F46A30A133F8A9ED3D038E2EA8  OU=www.verisign.com/CPS Incorporated LIABI...
109F1CAED645BB78B3EA2B94C0697C740733031C  CN=Microsoft Windows Hardware Compatibility,...

比較演算子

PowerShell には、値を比較したり、特定のパターンに一致する値を検索したりするときに使用する比較演算子が多数含まれています。 表 5-1 は、PowerShell の比較演算子の一覧です。

Operator Definition
-eq 等しい
-ne 等しくない
-gt より大きい
-ge 以上
-lt より小さい
-le 以下
-Like * ワイルドカード文字を使用した一致
-NotLike * ワイルドカード文字を使用した不一致
-Match 指定した正規表現と一致
-NotMatch 指定した正規表現と一致しない
-Contains コレクションに指定した値が含まれているかどうかを確認する
-NotContains コレクションに特定の値が含まれていないことを確認する
-In 指定した値がコレクションに存在するかどうかを確認する
-NotIn 指定した値がコレクションに含まれていないことを確認する
-Replace 指定した値を置き換える

表 5-1 に記載されている演算子はすべて、大文字と小文字が区別されません。 大文字と小文字を区別するには、表 5-1 に示されている演算子の前に c を置きます。 たとえば、-ceq は、大文字と小文字が区別される -eq 比較演算子です。

一部が大文字になっている "PowerShell" は、等号比較演算子を使用した場合、すべてが小文字の "powershell" と等しくなります。

'PowerShell' -eq 'powershell'
True

大文字と小文字が区別される等号比較演算子を使用した場合、これは等しくなりません。

'PowerShell' -ceq 'powershell'
False

不等号比較演算子は条件を逆にします。

'PowerShell' -ne 'powershell'
False

"より大きい"、"以上"、"より小さい"、"以下" のすべてを、文字列または数値で利用できます。

5 -gt 5
False

この例で "より大きい" ではなく "以上" を使用すると、5 と 5 は等しいため、ブール値 true が返されます。

5 -ge 5
True

この 2 つの例の結果から、"より小さい" または "以下" の動作を推測できます。

5 -lt 10
True

-Like 演算子と -Match 演算子については、経験豊富な PowerShell ユーザーでも混乱するかもしれません。 -Like はワイルドカード文字 * および ? と共に使用され、"like" 照合を実行します。

'PowerShell' -like '*shell'
True

-Match では、正規表現を使用して照合が行われます。

'PowerShell' -match '^*.shell$'
True

1 から 10 までの数値を変数に格納するには、範囲演算子を使用します。

$Numbers = 1..10

$Numbers 変数に 15 が含まれているかどうかを確認してみましょう。

$Numbers -contains 15
False

数値 10 が含まれているかどうかを確認します。

$Numbers -contains 10
True

-NotContains はロジックを逆にして、$Numbers 変数に値が含まれていないことを確認します。

$Numbers -notcontains 15
True

この例では、$Numbers 変数には確かに 15 が含まれていないため、ブール値 true が返されます。 しかし、数値 10 は含まれているため、テストを実行すると false になります。

$Numbers -notcontains 10
False

"in" 比較演算子は、PowerShell バージョン3.0 で初めて導入されました。 これは、値が配列に "ある" かどうかを確認するときに使用します。 $Numbers 変数は配列です。この変数には、複数の値が含まれているためです。

15 -in $Numbers
False

つまり、-in は、contains 比較演算子と同じテストを実行します。ただし、逆方向からはテストされません。

10 -in $Numbers
True

15 は $Numbers 配列にないため、次の例では false が返されます。

15 -in $Numbers
False

-contains 演算子と同様に、not-in 演算子のロジックを逆にします。

10 -notin $Numbers
False

この例では、$Numbers 配列に 10 が含まれており、この条件では 10 が含まれていないことを確認するテストを行ったため、false が返されます。

15は $Numbers 配列に "ない" ため、ブール値 true が返されます。

15 -notin $Numbers
True

-replace 演算子は、お察しのとおりに動作します。 これは何かを置き換えるときに使用します。 ある値を指定すると、その値がなくなります。 次の例では、"Shell" がなくなっています。

'PowerShell' -replace 'Shell'
Power

ある値を別の値に置き換える場合は、置換後の新しい値を、置き換えたいパターンの後ろで指定します。 "SQL Saturday in Baton Rouge" は、毎年の講演イベントです。 次の例で、"Saturday" という単語を省略形 "Sat" に置き換えます。

'SQL Saturday - Baton Rouge' -Replace 'saturday','Sat'
SQL Sat - Baton Rouge

Replace 演算子と同じように動作する Replace () などのメソッドを使って、何かを置き換えることもできます。 ただし、-Replace 演算子では、既定では大文字と小文字が区別されませんが、Replace () メソッドでは大文字と小文字が区別されます。

'SQL Saturday - Baton Rouge'.Replace('saturday','Sat')
SQL Saturday - Baton Rouge

この例では "Saturday" という単語が置き換えられていないことに注意してください。 これは、大文字と小文字の使い方が元の単語と異なるためです。 元の単語と同じように "Saturday" と指定すれば、Replace () メソッドによって、意図したとおりに置き換えられます。

'SQL Saturday - Baton Rouge'.Replace('Saturday','Sat')
SQL Sat - Baton Rouge

メソッドを使用してデータを変換するときは、"トルコ テスト" の失敗のように、予期しない問題が発生する可能性があるため注意が必要です。 例については、「Pester を使用した他のカルチャでの PowerShell コードのテスト」というタイトルのブログ記事を参照してください。 このような問題が発生しないように、できるだけメソッドではなく演算子を使用することをお勧めします。

比較演算子は前の例で紹介したように使用できますが、通常は、Where-Object コマンドレットを使用して、何らかのフィルター処理を行っています。

まとめ

この章では、右で書式設定、エイリアス、プロバイダー、および比較演算子に関するさまざまなトピックについて学習しました。

確認

  1. できるだけ右で書式設定を行う必要があるのは、なぜですか。
  2. % エイリアスを対象とした実際のコマンドレットを確認するには、どうすればよいですか。
  3. 保存するスクリプトや他のユーザーと共有するコードで使用すべきではないのは、なぜですか。
  4. いずれかのレジストリ プロバイダーに関連付けられているドライブで、ディレクトリのリストを実行してください。
  5. 置換メソッドではなく置換演算子を使用する主なメリットの 1 つは何ですか。