[PowerShell] PowerShell の演算子

handcraft 7/8/2009 46889 4.5 PowerShell

PowerShell でよく使いそうな演算子で私のような普段C#で開発している開発者が忘れやすい演算子を紹介します。

1. 2項演算子

等値とか比較は=や<>ではないのですね。PowerShell を触り始めの私はいきなりはまりました。

比較演算子で頭に -c が付いている場合、大文字、小文字を区別します。 -i が付いている場合は大文字、小文字を区別せずに比較を行います。-cが付与されない場合は通常大文字、小文字を区別せずに比較を行います。

 比較演算子  意味
 -eq, -ceq, -leq

 左の値が右の値と等しい

1.24 -eq 1.240
"test" -ceq "Test"
"test" -ieq "Test"
 -ne, -cne, -ine  左の値が右の値と等しくない 1.24 -ne 1.240
"test" -cne "Test"
"test" -ine "Test"
 -gt, -cgt, -igt  左の値が右の値より大きい 1 -gt 2
1 -gt 1
"ame" -cgt "AME"
"ame" -igt "AME"
 -ge, -cge, -ige  左の値が右の値以上 1 -ge 1
3 -ge 1
"ame" -cge "AME"
"ame" -ige "AME"
 -lt, -clt, -ilt  左の値が右の値より小さい 1 -lt 2
1 -lt 1
"ame" -clt "AME"
"ame" -ilt "AME"
 -le, -cle, -ile  左の値が右の値以下 1 -le 1
3 -le 1
"ame" -cle "AME"
"ame" -ile "AME"
 -contains, -ccontains, -icontains  左のコレクションに右の値が含まれる 1,2,3,4,5 -contains 1
"te","a","01" -contains "te"
"te","a","01" -ccontains "tE"
"te","a","01" -icontains "tE"
-notcontains, -cnotcontains, -inotcontains 左のコレクションに右の値が含まれない 1,2,3,4,5 -notcontains 1
"te","a","01" -notcontains "Te"
"te","a","01" -cnotcontains "Te"
"te","a","01" -inotcontains "Te"

2. パターン照合演算子

-like, -notlike というSQL の LIKE に相当する演算子を使用することができます。2項演算子と同様に-i が付く場合大文字小文字を区別しません。-c が付く場合、大文字、小文字を区別します。

演算子

説明
-like, -clike, -ilike 左の値が右のワイルドカードパターンに一致する場合$true 123 -like "[12]23"
"Test" -clike "t*"
"Test" -ilike "t*"
-notlike, -cnotlike, -inotlike 左の値が右のワイルドカードパターンに一致する場合$false 123 -notlike "[12]23"
"Test" -cnotlike "t*"
"Test" -inotlike "t*"

使用可能なワイルドカードパターンは次のような特殊文字を使用できます。

*  : 0個以上の任意の文字に一致
? : 任意の1文字に一致
[a-z] : 連続する文字に一致(左の例の場合はa-zの中の1文字)
[abcd] :abcdのうち1文字に一致

3. 書式指定演算子

Forrmat-List や Format-Table コマンドレットのように全体の整形できます。文字列を整形する場合はSystem.String.Format に該当する処理を -F 演算子で行えます。"{0:###.00}" -F 10.24 のように書式指定して文字列を作成できます。サンプルを記載します。 サンプルでは、"" で囲まれた変数が展開されるサンプルと' (バッククオート) を使用して変数展開をエスケープする例も記載しています。

##
# 書式設定演算子 -F
# Format-List Format-Table ではない
# [string]::Format()メソッドに近いです
"{1} price {0:###.00}" -F 10.235, "自転車"
# ''ではなく""で囲むと勝手に展開されます
$n = "自転車"
$p = 10
"$n price $p"
# バッククオートを使用すると変数展開をエスケープできます
"`$p の値は $p"

4. bit演算子、論理演算し

ビット演算子と論理演算しもC#とは違います。演算子と説明を記載します。

演算子 説明
-and 論理積
-or 論理和
-xor 排他的論理和
-not 論理否定
-band bitごとの論理積
-bor bitごとの論理和
-bxor bitごとの排他的論理和
-bnot bitごとの否定

5. バッククオートを使用したエスケープ処理

C#では\ (バックスラッシュ,円マーク) がエスケープ記号として使用されますが、PowerShell の場合 ` (バッククオート) がエスケープ文字として使用されます。以下エスケープ例

エスケープ文字列 説明
`n 改行
`r キャリッジリターン
`t タブ
`a アラート
`b バックスペース
`' シングルクオート
`" ダブルクオート
`0 null
`' バッククオート

6. 正規表現演算子

PowerShell では 正規表現用の演算子も用意されています。通常の.NET の Regex も使えます。先頭の文字が-i, -c の取り扱いはほかの演算子と同じです。-i の場合、大文字小文字を無視。-c の場合考慮されます。 .NET で使用できる正規表現パターンが使用できます。

演算子 説明
-match, -cmatch, -imatch

左の文字に右の正規表現パターン
に一致する文字列があれば$true

"namatamago" -match "Tamago"
"namatamago" -imatch "Tamago"
"namatamago" -cmatch "Tamago"

-notmatch, -cnotmatch, -inotmatch 左の文字に右の正規表現パターンに
一致する文字列がなければ$true

"test012" -notmatch "[abc].*"
"test012" -cnotmatch "[abc].*"
"test012" -inotmatch "[abc].*"

-replace, -creplace, -ireplace 左の文字列に右の正規表現に一致する
文字列をカンマで区切った右の文字列で置き換える
 "Large Book" -replace "large","small"
"Large Book" -creplace "large","small"
"Large Book" -ireplace "large","small"

-match 演算子では、一致したパターンが $matches 変数 に格納されます。マッチをグループ化することも同様にできます。サンプルを掲載します。マッチグループを名前付けするサンプルも掲載しています。正規表現グループに名前をつけると、その名前で一致した文字列を参照できます。

PS C:\> "Large Book" -match "(L.*) (B.*)"
True
PS C:\> $matches

Name                           Value
----                           -----
2                              Book
1                              Large
0                              Large Book


PS C:\> "Large Book" -match "(?<first>L.*) (?<second>B.*)"
True
PS C:\> $matches.first
Large
PS C:\> $matches.second
Book
PS C:\> $matches

Name                           Value
----                           -----
second                         Book
first                          Large
0                              Large Book

7. まとめ

説明は以上です。普段スクリプトを使っていない私が、新たに覚えたり、間違えてC#の演算子を使っていしまいそうな演算子を掲載しました。

誤り、指摘時事項などありましたらご連絡ください。