PowerShell の省略記法まとめ

Linux のシェルスクリプト習得者が PowerShell を触ろうとしたとき、コマンドレットやパラメータの名前が長すぎてカルチャーショックを受ける、という話をよく耳にします。確かに、 PowerShell の考え（厳密には、デフォルトの静的解析ツールである `PSScriptAnalyzer` の初期設定値）としては、そういった名前を省略しないことによって可読性を上げるのを重視している傾向があります。

ただ、私個人が勝手に思っていることですが、**省略非推奨はあくまで `ps1` ファイルでスクリプトを書くときの話であって、ターミナルで打ち込む時にも、同じようにフルスペルで書く必要はない**と思っています。

そういう背景があって、この記事では PowerShell の省略記法をもうちょっと世に広めることで、 PowerShell への嫌悪感を少なくできればな、という気持ちで書きました。

~~むしろ嫌悪感が増えてしまう可能性は否定できない~~

# 1. エイリアス

PowerShell では、よく使用されるコマンドレットに対して短い別名（エイリアス）が用意されています。

## 1-1. `*-Object` コマンドレット

`-Object` で終わるコマンドレットは `-Object` を省略したエイリアスが利用可能です。
また、 `Where-Object` と `ForEarch-Object` についてはそれぞれ記号版のエイリアスもついています。

```powershell
# Where-Object (別名: where, ?)
1..10 | where { $_ % 2 -eq 0 }
#=> 2
#=> 4
#=> 6
#=> 8
#=> 10

1..10 | ? { $_ % 2 -eq 0 }
#=> （同上）

# ForEach-Object (別名: foreach, %)
1..5 | foreach { $_ * 2 }
#=> 2
#=> 4
#=> 6
#=> 8
#=> 10

1..5 | % { $_ * 2 }
#=> （同上）

# Group-Object (別名: group)
@(
    [PSCustomObject]@{ Name = "リンゴ"; Color = "赤" }
    [PSCustomObject]@{ Name = "トマト"; Color = "赤" }
    [PSCustomObject]@{ Name = "バナナ"; Color = "黄" }
    [PSCustomObject]@{ Name = "みかん"; Color = "橙" }
    [PSCustomObject]@{ Name = "にんじん"; Color = "橙" }
) | group Color
#=> Count Name                      Group
#=> ----- ----                      -----
#=>     1 黄                        {@{Name=バナナ; Color=黄}}
#=>     2 赤                        {@{Name=リンゴ; Color=赤}, @{Name=トマト; Color=赤}}
#=>     2 橙                        {@{Name=みかん; Color=橙}, @{Name=にんじん; Color=橙}}

# Measure-Object (別名: measure)
1..100 | measure -Average -Sum -Maximum -Minimum -StandardDeviation
#=> Count             : 100
#=> Average           : 50.5
#=> Sum               : 5050
#=> Maximum           : 100
#=> Minimum           : 1
#=> StandardDeviation : 29.011491975882
#=> Property          :

# Select-Object (別名: select)
"one", "two", "three", "four", "five" | select -First 3
#=> one
#=> two
#=> three

# Sort-Object (別名: sort)
"zebra", "cat", "dog", "elephant" | sort
#=> cat
#=> dog
#=> elephant
#=> zebra

# Tee-Object (別名: tee)
"Hello, World!" | tee -FilePath 'test.txt'
#=> Hello, World!
Get-Content .\test.txt
#=> Hello, World!
```

## 1-2. Linux ライクなエイリアス

Linux ユーザーのために、馴染みのあるコマンドもエイリアスとして提供されています。

```powershell
ls    # Get-ChildItem のエイリアス
cat   # Get-Content のエイリアス
cd    # Set-Location のエイリアス
pwd   # Get-Location のエイリアス
rm    # Remove-Item のエイリアス
cp    # Copy-Item のエイリアス
mv    # Move-Item のエイリアス
```

## 1-3. 他のエイリアスの確認方法

エイリアスの確認は以下のコマンドで行えます。

```powershell
# すべてのエイリアスを表示
Get-Alias

# 特定のエイリアスの詳細を確認
Get-Alias -Name ls

# コマンドレットに対するエイリアスを確認
Get-Alias -Definition Get-ChildItem
```

# 2. Get-\* コマンドレット

`Get-` から始まるコマンドレットは、`Get-` を省略することができます：

```powershell
Get-Location    # 完全な形
location        # Get- の省略

Get-Process     # 完全な形
process         # Get- の省略
```

また、これはエイリアスではなく、 PowerShell がコマンドレットや関数の名前解決をする仕組みによるものなので、ユーザが定義した関数でも同じように省略ができます。

```powershell
function Get-Hoge {
    return "HogeHoge"
}

hoge
#=> HogeHoge
```

# 3. パラメータの省略

パラメータ名は、一意に識別できる最小の文字数まで省略することができます。

```powershell
Get-Date -Year 2023
#=> 2023年12月15日 15:46:29

Get-Date -y 2023
#=> 2023年12月15日 15:47:03

# -m の場合、 -Month なのか -Minute なのか区別がつかないため、 -mo まで指定する必要がある。
Get-Date -mo 11
#=> 2024年11月15日 15:47:39
```

# 4. return の省略

Script ブロック内では、最後の式の評価結果が自動的に返されるため、`return` キーワードを省略できます。

```powershell
function Get-Greeting($Name) {
    return "こんにちは、$Name さん"    # return を使用
}

function Get-Greeting($Name) {
    "こんにちは、$Name さん"           # return を省略
}

# どちらも同じ結果
Get-Greeting -Name '名無し'
```

ちなみに、２つこういう文を書くと、戻り値の型は配列になります。

```powershell
function Get-DoubleGreeting($Name) {
    "こんにちは、$Name さん"
    "さようなら、$Name さん"
}

Get-DoubleGreeting -Name '名無し'
#=> こんにちは、名無し さん
#=> さようなら、名無し さん

(Get-DoubleGreeting -Name '名無し').GetType().Name
#=> Object[]
```

また、関数でサンプルコードを書いていますが、関数の仕様というより、Script ブロックの仕様のため、 `ForEach-Object` などで指定するスクリプトブロックも同様です。

# 5. 数値型アクセラレータ

型変換時には、より短い形式の型アクセラレータを使用できます。

```powershell
# 長い形式
[System.Int32]$number = 42
[System.Double]$pi = 3.14

# 短い形式（型アクセラレータ）
[int]$number = 42
[double]$pi = 3.14

# よく使用される型アクセラレータ
[int]      # 32ビット整数
[long]     # 64ビット整数
[string]   # 文字列
[bool]     # 真偽値
[decimal]  # 10進数
[float]    # 単精度浮動小数点
```

他の型アクセラレータについては公式ドキュメントをご参照ください。

[数値型アクセラレータ - learn.microsoft.com](https://learn.microsoft.com/ja-jp/powershell/module/microsoft.powershell.core/about/about_numeric_literals?view=powershell-7.4#numeric-type-accelerators)

また、既出ですが、`[pscustomobject]` も HashTable から変換する際によく使用します。
これは、 `System.Management.Automation.PSObject` の型アクセラレータになります。

```powershell
# HashTable
@{ Name = "リンゴ"; Color = "赤" }
#=> Name                           Value
#=> ----                           -----
#=> Color                          赤
#=> Name                           リンゴ

# pscustomobject に変換
[pscustomobject]@{ Name = "リンゴ"; Color = "赤" }
#=> Name   Color
#=> ----   -----
#=> リンゴ 赤

# 型アクセラレータを使用しない版
New-Object System.Management.Automation.PSObject `
    -Property @{ Name = "リンゴ"; Color = "赤" }
#=> （同上）
```

# 6. 型サフィックス

数値リテラルには型を示すサフィックスを付けることができ、明示的な型変換を省略できます。

```powershell
# メモリサイズの指定
$size = 4kb      # 4 キビバイト (4 * 1024)
$large = 2gb     # 2 ギビバイト (2 * 1024^3)

# 整数型の指定
$byte = 255y     # 符号付きバイト
$uint = 42u      # 符号なし整数
$long = 9999l    # long型
$ulong = 9999ul  # 符号なしlong型

# BigInteger
$big = 123456789n  # BigInteger型
```

他の型サフィックスについては公式ドキュメントをご参照ください。

[整数リテラル - learn.microsoft.com](https://learn.microsoft.com/ja-jp/powershell/module/microsoft.powershell.core/about/about_numeric_literals?view=powershell-7.4#integer-literals)