PowerShellの使い方

コンピュータ

PowerShellのスクリプト言語としての基本的な使い方をまとめてみました。
よく使いそうな機能をピックアップした説明となります。

はじめに

PowerShellはコマンドラインシェルとスクリプト言語の名称です。
マイクロソフトが作ったスクリプト言語らしく、機能全部乗せで、てんこ盛りな感じです。
様々なスクリプト言語の良い部分を参考にしたと思われる部分が多数見受けられます。
本稿ではPowerShellの特徴的な部分を避けて、多くの言語と共通部分の重点的に取り上げます。

開発環境・実行環境

PowerShellはWindows,Linux,macOSで動作しますが、Windowsでは標準シェルスクリプトとしてプリインストールされているので、WindowsPC所有者はすぐ使い始められます。
開発に必要なツールとしてはテキストエディタが必要になり、Windows標準のメモ帳でも可能ですが、VScodeなどのテキストエディタがおすすめです。

スクリプトの実行を許可

シェルの起動
Winキーを押し「powershell」(PowerShell7の場合はpwsh)と入力し「Windows PowerShell」上で右クリック→「管理者として実行」を選択

起動したシェルに以下のコマンドをコピー&ペーストしエンターキーを押し、スクリプトの実行を許可します。

Set-ExecutionPolicy RemoteSigned

プログラムの実行

テキストエディタでファイル名を「hello.ps1」という名前でテキストファイルを任意のフォルダに保存します。

Write-Host "Hello PowerShell"

シェルでhello.ps1が保存されたフォルダに移動し以下のコマンドを入力しエンターキーを押すとプログラムが実行されます。

PS C:\Users\karet\src\PowerShell> .\hello.ps1
Hello PowerShell

プログラムの内容はWrite-Hostコマンドレットで任意の文字列”Hello PowerShell”をコンソールに出力する、プログラムとなります。
.\hello.ps1の.\は現在のフォルダ(C:\Users\karet\src\PowerShell>)を表し、そのフォルダにあるhello.ps1というファイルを実行しなさいという命令になります。
次の行のHello PowerShellはスクリプトの実行結果になります。

コンソールの文字出力

前項でも文字の出力をしていますが、シェルで実行するプログラムを組む場合、コンソールに文字出力することで、処理結果を可視化することが出来るので、プログラミングを始めるにあたり最初に覚えておくとよいでしょう。

PowerShellの場合コンソールで文字を出力する方法は
Write-Host "出力する文字列"
Hostがコンソールと読み替えると、コンソールに文字列を書き込むという意味になります。

似たようなコマンドレットで次のようなコマンドレットがあります。
Write-Output "出力する文字列"
こちらは、ストリームに結果を書き込むという意味らしいですが、この場合のストリームのデフォルトは標準出力で、PowerShellでの標準出力はデフォルトでコンソールに出力されるので、単体で実行するとWrite-Hostと似たふるまいになります。

変数

変数はデータを入れる器で、PowerShellの変数は、あらゆるデータ(.NETオブジェクト)を受け入れることが出来ます。

$x = 10          # Int32
$x = "text"      # String
$x = Get-Date    # DateTime
[int]$y = "42"   # 明示的に型を指定

上記の例では変数の利用とオブジェクトの初期化、変数の代入を1行で実行しています。
明示的に型を指定では変数の型は整数型(Int)を指定していますが、代入している値は数字を記述した文字列になります。
これは、代入初期化だけではなく、文字列を数値(整数型)に変換処理も同時に実行しています。

四則演算

10 + 3      # 足し算(13)
10 - 3      # 引き算(7)
10 * 3      # 掛け算(30)
10 / 3      # 割り算(3.333...)

基本、数値型ですが、割り算などで小数点が必要なると浮動小数点型に変換します。
便利なのですが、計算誤差が発生するので金額計算には向いていません。
金額計算ではdecimal(10 進固定小数)を使うようにしましょう。

# 10進の decimal リテラルは末尾に m / M
$price  = 199.99m
$tax    = 0.10m
$total  = $price * (1m + $tax)   # 正確な10進で計算

文字列をdecimalに変換する例

# 文字列→decimal に変換
$amount = [decimal]"123.45"

※金額計算がデフォルトでできないのは不思議な感じがしますが、PowerShellはまだマシな部類で、JavaScriptは基本doubleで金額計算には特別なライブラリが必須の言語も存在します。

文字列操作

"Power" + "Shell"                # 文字列の連結
"Hello World" -replace "World","PowerShell"  # 文字列の置き換え
"Apple,Banana,Orange" -split ","             # 文字列の分割

日付型

(Get-Date).ToString("yyyy/MM/dd HH:mm:ss")   # 日付型 → 文字列
[datetime]"2025/10/19 12:00:00"              # 文字列 → 日付型

条件分岐

$score = 75
if ($score -ge 80) {  # 80以上なら
    # 条件が真の場合の処理
} else {
    # 条件が偽の場合の処理
}

PowerShell の条件演算子と一般的な言語の対応表

機能 PowerShell C 系言語の例(C# / Java / JS など)
等しい / 等しくない -eq / -ne == / !=
大小比較 -gt -ge -lt -le > >= < <=
文字列の大小(大/小文字区別アリ) -ceq -cne など -c* Equals / .equals(オプションで区別)や ==
部分一致(ワイルドカード) -like / -notlike Contains / includes / 正規表現 など
正規表現マッチ -match / -notmatch Regex.IsMatch(...) / Pattern / /.../.test()
コレクションが要素を含むか -contains list.Contains(x) / includes
要素がコレクション内にあるか -in / -notin list.Contains(x) / includes / in(Python)
論理演算 -and / -or / -not! も可) && / || / !
条件(三項)演算子 条件 ? 真 : 偽(PowerShell 7+) 条件 ? 真 : 偽
Null 合体(左が null なら右) ?? / ??=(PowerShell 7+) ?? / ??=

注意点

  • PowerShell の文字列比較は既定で大/小文字を区別しません。区別したい場合は -ceq / -cne / -clt などを使います。
  • -contains-in向きが逆$arr -contains $x(配列→要素)、$x -in $arr(要素→配列)。
  • -like はワイルドカード(* / ?)で、厳密なパターンは -match(正規表現)。
  • 三項演算子と ??PowerShell 7 以降。Windows PowerShell 5.x では使用不可です。

配列

$a = @()           # 宣言(空の配列)
$a = 1,2,3         # 初期化
$a[1] = 42         # 変更(代入)
$a[0]              # 参照

繰り返し・ループ処理

for ($i = 0; $i -lt 3; $i++) { # for文
    # 繰り返し処理
}

$i = 0
while ($i -lt 3) {              # while文
    # 繰り返し処理
    $i++
}
※PowerShellには、foreach構文やForEach-Objectコマンドレットなど、便利なループ処理機能もあります。

サブルーチン

メインルーチンから処理を切り離しサブルーチンとして関数を定義できます。

function SayHello {      # 関数の定義
    "Hello, PowerShell!" # 実行内容
}
SayHello                  # 呼び出し

クラス・構造体

クラス機能あり、構造体は無し、本記事では詳細説明は割愛します。

ファイルI/O

Set-Content -Path "test.txt" -Value "Hello, PowerShell!"  # ファイルへ書き込み
Get-Content -Path "test.txt"                              # ファイルの読み込み

感想

本稿は、PowerShellの特徴であるパイプライン処理が含まれない内容ですが、今回の内容だけ見ると意外と普通なスクリプト言語(シェルスクリプト)といった感じがします。

コメント