【PowerShellを始める】その8)スクリプティングと自動化

PowerShell

変更履歴

Rev. 0.7 : 2025年06月12日
新規作成

1 はじめに

【PowerShellを始める】第8回目は、PowerShellのスクリプトと自動化についてです。

PowerShellスクリプトとは、Windows PowerShellで実行するコマンドをファイルに記述して、
まとめて実行できるようにする仕組みです

手動で行っていた複雑な処理を自動化し、作業効率を向上させることができます。

PowerShellって、従来のWindowsコマンドプロンプトやLinuxなどUNIX系のBashなどと
比べるとどうも難しい。

とにかく、コマンドレット(cmdlet)やオブジェクト(object)っていうのが、 よくわからない。
訳のわからない演算子もたくさんでてくる。
関数も、訳のわからない属性設定がいっぱいある。

それじゃー、わかるところを始めようとしたのは、この【PowerShellを始める】シリーズです。
本シリーズは、PowerShellにどのような要素があるのかをまとめただけであり、
実際にPowerShellを利用する際のインデックスであることを目的に構成しました。

【PowerShellを始める】シリーズの全容は、
最終章(6章 【PowerShellを始める】全容)に示します。
よければ、ご覧ください。

PowerShell個別の問題については、適宜記事にしていきたいと思っています。

2 PowerShellスクリプトファイル

まずは、PowerShellスクリプトの記述フォーマットについてから。

2.1 ファイル名拡張子

PowerShellスクリプトファイルの拡張子は、”.ps1”です。

2.2 基本的なフォーマット

2.2.1 コメントの書き方

PowerShellでは、読みやすくするために、コードに注釈を付けたり、
構造化したりするためのコメントを記述することができます。
コメントについて | Learn / PowerShell

【単一行コメント】
#”から始まる行は、コメント行です。
#”の位置から行の終わりまでがコメントとして扱われます。
コメントは、行の途中からつけることもできます。

# これは単一行コメントです
Write-Output "Hello World"     # ここもコメント

【複数行コメント】
複数の行に渡って”<#”と”#>”で囲まれた範囲は、コメント扱いとなります。

<#
   これは複数行コメントです
   複数行にわたって説明を書くときに便利です
 #>

2.2.2 コマンド継続行

PowerShellでは、
行末にバックスラッシュ””(エスケープ文字)を置くことで行を継続できます。

Write-Output "これは長い文字列で"
             "複数行に分けて書いています"

ただし、バッククォートは見づらくなることがあるので、
以下のように括弧やパイプラインを使う方法も推奨されています。

# 括弧で囲む方法(自動的に継続行と認識される)
Write-Output (
    "これは長い文字列で" +
    "複数行に分けて書いています"
)
 
# パイプラインで継続
Get-Process |
    Where-Object { $_.CPU -gt 100 } |
    Sort-Object CPU

2.2.3 変数

変数は”$”で始まります。
変数名は、英数字と”_”(アンダースコア)が使えます。

$abc
$var_example

2.2.4 インデントと改行

一般的にスペース2~4つでインデントします。

ブロック構造(ifforeachfunctionなど)の中は、インデントをつけて可読性を上げます。

if ($true) {
    Write-Output "Trueです"
}
else {
    Write-Output "Falseです"
}

2.2.5 関数の書き方

下に関数の一例を示します。

function Get-Greeting {
    param (
        [string]$Name
    )
    Write-Output "Hello, $Name!"
}

2.2.6 その他

コマンドレット名は、「動詞-名詞」の形式にするのが推奨されています(PowerShell標準に準拠)。
変数や関数名は、キャメルケース(例: $myVariable、Get-Data)が多いです。

スクリプトの先頭にスクリプトの説明や作成者情報をコメントで書くことが多い。

2.3 特殊文字

PowerShellでは、標準文字セットの一部ではない文字を表すために使用される
一連の特殊文字シーケンスがサポートされています。
これらのシーケンスは、一般にエスケープシーケンス(escape sequence)と呼ばれています。
about_Special_Characters | Learn / PowerShell

エスケープシーケンスは、バックスラッシュ””で始まり、大文字と小文字が区別されます。
バックスラッシュ文字は、escape文字とも呼ばれます。

エスケープシーケンスは、二重引用符()文字列に含まれている場合にのみ解釈されます。

【備考: Unicode文字 'u(x)】
Unicodeエスケープシーケンス(
u{x})を使用すると、

コードポイントの16進数表現で任意の Unicode 文字を指定できます。

これには、基本多言語平面(>0xFFFF)の上にあるUnicode文字が含まれ、
(`u{1F44D})文字などの絵文字が含まれます。

Unicodeエスケープシーケンスでは、少なくとも1つの16進数が必要であり、
最大6桁の16進数がサポートされます。
シーケンスの最大16 進数の値は、10FFFFです。
【Unicode】Unicodeについて整理してみた

次の使用例は、上下向き矢印””記号を出力します。

3 PowerShellのスコープ

コンソールでコマンドを実行しているだけであれば、
スコープが大きく影響を与えることはありませんが、
スクリプトを扱うときには混乱を招きやし機能の1つです。

3.1 スコープが作られる要素

スコープが作られる要素は、次の3つがあります。

グローバルによる生成
PowerShellを起動したときのコンソール画面など、
PowerShell開始時のセッションがグローバルスコープです。

スクリプトによる生成
PowerShellでスクリプトを実行するときに、自動的に生成されます。
スクリプトから別のスクリプトを呼び出したときも、
その中に新しいスコープが生成されます。

関数による生成
関数を定義すると、自動生成されます。

3.2 スコープの親子関係

スコープには、親子関係ができます。

一番上にはグローバルスコープがあります。
グローバルスコープは1つ以上の関数を持ち、
スクリプトを実行するとスクリプトスコープを持ちます。

スクリプトや関数は、自身のスコープを作り、また内部にスクリプトや関数をもつことができます。

1つのスコープが他のスコープを呼び出したとき、呼び出し側が「親スコープ」になり、
作られたスコープが「子スコープ」となります。

3.3 スコープ名とスコープ修飾名

PowerShellでは、表3.3-1に示すように一部のスコープの名前を定義しており、
そのスコープに簡単にアクセスできるようになっています。

各スコープの定義範囲は、次のページでご確認ください。

about_Scopes | Learn / PowerShell

変数、エイリアス、または関数名には、
省略可能なスコープ修飾子のいずれかを含めることができます。

3.4 ドットソース

ドットソース表記を使用してスクリプトまたは関数を実行すると、
現在のスコープで実行されます。

スクリプトまたは関数内のすべての関数、エイリアス、変数が現在のスコープに追加されます。

下に示すのは、”helper.ps1”スクリプト内の”HelperFunction”関数が、
main.ps1”スクリプトのスコープで実行される例です。

4 スクリプトの実行

4.1 起動パラメーターと終了値

4.1.1 起動パラメータ

スクリプトでパラメーターを定義するには、
関数パラメーターと同様paramステートメントを使用します。

paramステートメントは、コメントと”#Requiresステートメントを除き、
スクリプトの最初のステートメントである必要があります。

スクリプトパラメーターは、関数パラメーターと同様に機能します。
パラメーター値は、スクリプト内のすべてのコマンドで使用できます。
Parameter属性とその名前付き引数を含む関数パラメーターのすべての機能は、
スクリプトでも有効です。

詳しくは、次のページをご覧ください。

about_Parameters | Learn / PowerShell

4.1.2 終了値

既定では、スクリプトが終了しても、スクリプトは終了状態を返しません。
スクリプトから終了コードを返すには、”exitステートメントを使用する必要があります。

exitステートメントは、既定では0を返します。

別の終了状態を返す数値を指定できます。
通常、0以外の終了コードはエラーを通知します。

about_Scripts | Learn / PowerScript

PowerShellでは、exitステートメントによって”$LASTEXITCODE”変数の値が設定されます。

Windowsコマンドシェル”cmd.exe”では、
exitステートメントによって”%ERRORLEVEL%”環境変数の値が設定されます。

4.2 エラー処理

4.2.1 変数$ErrorActionPreference

PowerShellには、スクリプトやコマンド実行時のエラー処理の動作を制御するための
基本設定変数$ErrorActionPreference”があります。

PowerShellでエラーが発生した際に、
どのように振る舞うか(エラーを無視する、警告を表示する、停止するなど)を指定します。

グローバルな設定なので、スクリプトやセッション全体に影響します。
特定のコマンドだけに適用したい場合は、”-ErrorAction”パラメーターを使うことが多いです。

$ErrorActionPreference変数は、 表4.2-1に示すいずれかの列挙値を受け取ります。

【使い方の例】

4.2.2 例外をキャッチ

$ErrorActionPreferenceを”Stop”に設定すると、
トライキャッチ構文try { } catch { })でエラーを捕捉しやすくなります。

4.3 スクリプトを起動する

PowerShellスクリプトを起動するには、次のような方法があります。

① エクスプローラーから起動する
② PowerShellコンソールから起動する
③ スクリプトファイルから別ファイルのスクリプトを呼び出す
④ コマンドプロンプトBATファイルからスクリプトを呼び出す
④ タスクスケジューラから起動する

4.3.1 エクスプローラーから起動する

エクスプローラーで、PowerShellスクリプトファイルを選択して右クリック。
現れたコンテキストメニューから、「PowerShellで実行」を選択すれば、スクリプトは実行されます。

4.3.2 PowerShellコンソールから起動する

PowerShellコンソールを立ち上げてスクリプトファイル名を入力すれば、
スクリプトは実行されます。

4.3.3 スクリプトファイルから別ファイルのスクリプトを呼び出す

PowerShellでスクリプトファイルから別のスクリプトファイルを呼び出すには、 表4.3-1に示すような方法があります。

【詳細】

. “.”(ドット)ソースを使う方法(Dot Sourcing)
別のスクリプトファイルを現在のスコープで実行し、
その中で定義された関数や変数を呼び出し元のスクリプトでも利用可能な方法です。

【書き方】
. <スクリプトファイルパス>.ps1

<スクリプトファイルパス>の前には、必ずドットと半角スペースが必要です。

. ”&”(呼び出し演算子)を使う方法
別スクリプトを新しいスコープで実行します。
呼び出し元のスクリプトの変数や関数は影響しません。

【書き方】
& <スクリプトファイルパス>.ps1

. ”Invoke-Command”を使う方法
スクリプトを別プロセスやリモートで実行したい場合に使います。
単純な呼び出しにはあまり使われません。

新しいスコープで実行されるため、変数や関数は共有されません
実行結果や出力は取得できます。

. モジュールとして読み込む方法
スクリプトをモジュール化し、”Import-Module”で読み込むことも可能です。
関数や変数を整理して再利用性を高める場合に有効です。

4.3.4 コマンドプロンプトBATファイルからスクリプトを呼び出す

WindowsのBATファイルcmd.exe)からPowerShellスクリプトを呼び出すには、
表4.3-2に示すような方法があります。

【詳細】

. powershellコマンドを使う方法

【基本構文】
powershell -File <スクリプトファイルパス>.ps1

. powershellコマンドでスクリプト内容を直接指定する方法

【基本構文】
powershell -Command "& { <:PowerShellコマンド> }"

. PowerShell 7(pwsh)を使う場合

4.3.5 タスクスケジューラから起動する

本記事では、詳細を割愛します。 

5 PowerShellの実行ポリシー

PowerShellには「実行ポリシー」という、
スクリプトの実行に関するセキュリティ制限の設定があります。
悪意のあるスクリプトの実行を防ぎ、システムの安全性を保つために設けられています。

Windowsコンピューターでは、
ローカル コンピューター、
現在のユーザー、
または
特定のセッション
に対して実行ポリシーを設定できます。

グループポリシー設定を使用して、
コンピューターとユーザーの実行ポリシーを設定することもできます。

詳しくは、次のページをご覧ください。
about_Execution_Policies | Learn / PowerShell

5.1 主な実行ポリシーの種類

PowerShell実行ポリシーには、 表5.1-1に示すようなものがあります。

現在の実行ポリシーは、 ”Get-ExecutionPolicy”コマンドレットで確認することができます。

変更は、 ”Set-ExecutionPolicy”コマンドレットで行うことができます。

5.2 実行ポリシーのスコープ

特定のスコープでのみ有効な実行ポリシーを設定できます。
Scopeの有効な値を表5.2-1に示します。

LocalMachine”は、実行ポリシーを設定するときの既定値です。

5.3 実行ポリシー違反の場合の対処方法

PowerShellでスクリプトを実行したとき、
エラーが表示されてスクリプトが実行できない場合があります。

PowerShell 7.5などの最新のPowerShellをインストールしていない場合、
PowerShell 5.1が起動します。

PowerShell 5.1でのスクリプトの実行スコープは”Process”で、
実行ポリシーは既定では”Undefined”です。
Undefined”の実行ポリシーは、Windowsクライアントでは”Restricted”として扱われます。

このため、次のようなエラーが発生し、スクリプトを実行できません。

  このような実行ポリシー違反は、下に示すよう ”Set-ExecutionPolicy”コマンドレットで、
PowerShell実行ポリシーを変更することで対処します。

以上

本記事の元となっているWordで作成したPDFを
ページ最後に貼り付けました。

少しでも役に立てていただければ、うれしく思います。

このPDFファイルは、自由に配布されてもかまいません。
ただし、再配布の際には、
入手元著者名は明らかにしてください

なお、上のPDFファイルの内容、また本文中の記述に、
誤字や脱字、誤った内容の記述など見つかりましたら、
下に示すフォームでご連絡いただければ幸いです。

お問い合わせ

 

コメント

Add A Knowledge Base Question !

You will receive an email when your question will be answered.

+ = Verify Human or Spambot ?

タイトルとURLをコピーしました