PowerShell
1. はじめに
[編集]PowerShellの概要
[編集]歴史と進化
[編集]PowerShellは、Microsoftが開発したタスク自動化および構成管理のためのフレームワークであり、コマンドラインシェルとスクリプト言語を兼ね備えています。2006年に最初のバージョンがリリースされて以来、PowerShellは進化を続けてきました。Windows PowerShellはWindows専用でしたが、PowerShell Coreはクロスプラットフォーム対応となり、macOSやLinuxでも動作するようになりました。
Windows PowerShellとPowerShell Core (.NET Core)の違い
[編集]- Windows PowerShell: Windows専用のバージョンで、.NET Framework上で動作します。システム管理やスクリプト作成に広く使用されてきました。
- PowerShell Core: クロスプラットフォーム対応で、.NET Core上で動作します。Windows、macOS、Linuxで使用でき、オープンソースとして提供されています。
PowerShellのインストール
[編集]Windows PowerShellのインストール方法
[編集]Windows PowerShellは通常、Windows OSに標準でインストールされています。確認するには、PowerShell
と入力してスタートメニューからアプリケーションを開くか、powershell
と入力してコマンドプロンプトから起動します。
各プラットフォームでのPowerShell Coreのインストール方法
[編集]- Windows
-
- :# 公式サイトから最新のPowerShell Coreのリリースをダウンロードします。
- ダウンロードしたインストーラーを実行し、指示に従ってインストールします。
- インストールが完了したら、
pwsh
と入力してPowerShell Coreを起動します。
- macOS
-
- Homebrewを使用してインストールすることができます。まず、ターミナルを開きます。
- 以下のコマンドを実行してHomebrewをインストールします(まだインストールされていない場合):
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
- Homebrewを使用してPowerShellをインストールします:
brew install --cask powershell
- インストールが完了したら、
pwsh
と入力してPowerShell Coreを起動します。
- Linux
-
- パッケージリポジトリからインストールできます。たとえば、Debianの場合、以下のコマンドを実行します:
sudo apt-get update sudo apt-get install -y wget apt-transport-https software-properties-common wget -q https://packages.microsoft.com/config/ubuntu/20.04/packages-microsoft-prod.deb sudo dpkg -i packages-microsoft-prod.deb sudo apt-get update sudo apt-get install -y powershell
- インストールが完了したら、
pwsh
と入力してPowerShell Coreを起動します。
- パッケージリポジトリからインストールできます。たとえば、Debianの場合、以下のコマンドを実行します:
2. 初めてのPowerShell
[編集]基本概念
[編集]コマンドラインインターフェースの基本
[編集]PowerShellは、コマンドラインインターフェース(CLI)を提供し、ユーザーがコマンドを直接入力して実行することができます。CLIは、迅速かつ効率的にタスクを実行するための強力なツールです。
Cmdlet: 構造と使用方法
[編集]PowerShellのコマンドはCmdlet(コマンドレット)と呼ばれ、Get-Command
、Get-Help
、Set-Item
などの一貫した命名規則(動詞-名詞形式)を持っています。Cmdletは、特定のタスクを実行するために設計された小さなプログラムです。
エイリアスの理解
[編集]エイリアスは、Cmdletの短縮名や別名で、コマンド入力を簡略化するために使用されます。たとえば、Get-ChildItem
はls
やdir
といったエイリアスで呼び出すことができます。
PowerShellの初歩
[編集]ファイルシステムのナビゲーション
[編集]PowerShellでは、以下のコマンドを使用してファイルシステムをナビゲートできます:
Get-Location
(エイリアス:pwd
): 現在のディレクトリを表示Set-Location
(エイリアス:cd
): ディレクトリを変更Get-ChildItem
(エイリアス:ls
): ディレクトリ内のアイテムを一覧表示
基本的なCmdlet
[編集]Get-Help
- Cmdletのヘルプ情報を表示
Get-Help Get-ChildItem
Get-Command
- 使用可能なコマンドを一覧表示
Get-Command
Get-Member
- オブジェクトのプロパティやメソッドを表示
Get-ChildItem | Get-Member
3. スクリプトの基本
[編集]最初のスクリプトを書く
[編集]スクリプトファイルの構造と実行方法
[編集]PowerShellスクリプトは、.ps1
拡張子のファイルに保存されます。最初のスクリプトとして、次の内容をHelloWorld.ps1
というファイルに保存します:
# HelloWorld.ps1 Write-Output "Hello, World!"
スクリプトを実行するには、PowerShellプロンプトで次のコマンドを入力します:
.\HelloWorld.ps1
コメントの書き方
[編集]コメントは、スクリプトの可読性を高めるために使用されます。単一行のコメントは#
で始まり、複数行のコメントは<#
と#>
で囲みます:
# これは単一行のコメントです <# これは複数行の コメントです #>
変数とデータ型
[編集]変数は$
記号で始まり、任意の値を格納できます:
$greeting = "Hello, World!" $number = 42 $decimal = 3.14
4. 高度なスクリプト
[編集]制御構造
[編集]条件文 (if, switch)
[編集]条件文を使用して、スクリプトの実行フローを制御できます。
if
文$number = 10 if ($number -lt 20) { Write-Output "Number is less than 20" } elseif ($number -eq 20) { Write-Output "Number is 20" } else { Write-Output "Number is greater than 20" }
switch
文$day = "Monday" switch ($day) { "Monday" { Write-Output "Start of the work week" } "Friday" { Write-Output "End of the work week" } default { Write-Output "Midweek day" } }
ループ (for, foreach, while, do-while)
[編集]ループ構造を使用して、繰り返し処理を実行できます。
for
ループfor ($i = 0; $i -lt 5; $i++) { Write-Output "Iteration $i" }
foreach
ループ$items = 1..5 foreach ($item in $items) { Write-Output "Item: $item" }
while
ループ$counter = 0 while ($counter -lt 5) { Write-Output "Counter: $counter" $counter++ }
do-while
ループ$counter = 0 do { Write-Output "Counter: $counter" $counter++ } while ($counter -lt 5)
関数の作成
[編集]関数の定義と呼び出し
[編集]関数を使用して、再利用可能なコードブロックを作成できます。
function Get-Greeting { param ( [string]$name ) return "Hello, $name!" } # 関数の呼び出し $greeting = Get-Greeting -name "PowerShell" Write-Output $greeting
スコープとパラメータ
[編集]関数内の変数はデフォルトでローカルスコープにあります。関数にパラメータを渡すことで、柔軟な処理が可能になります。
function Set-Message { param ( [string]$message, [int]$count ) for ($i = 1; $i -le $count; $i++) { Write-Output "$i: $message" } } Set-Message -message "Hello" -count 3
エラーハンドリング
[編集]try, catch, finally
[編集]エラーハンドリングを行うことで、スクリプトの堅牢性を向上させることができます。
try { $result = 1 / 0 } catch { Write-Output "An error occurred: $_" } finally { Write-Output "This block runs regardless of error occurrence" }
エラーメッセージのカスタマイズ
[編集]カスタムエラーメッセージを使用して、ユーザーにわかりやすい情報を提供できます。
function Divide-Numbers { param ( [int]$a, [int]$b ) try { if ($b -eq 0) { throw "Division by zero is not allowed" } return $a / $b } catch { Write-Output "Error: $_" } } Divide-Numbers -a 10 -b 0
5. モジュールとパッケージ管理
[編集]モジュールの管理
[編集]モジュールのインポートとエクスポート
[編集]モジュールは、複数の関数やCmdletをまとめたパッケージです。インポートとエクスポートを行うことで、モジュールを活用できます。
# モジュールのインポート Import-Module -Name ModuleName # モジュールのエクスポート(スクリプト内) Export-ModuleMember -Function FunctionName
独自モジュールの作成
[編集]独自のモジュールを作成することで、再利用可能なスクリプトを簡単に配布できます。
- MyModule.psm1
function Get-CustomGreeting { param ( [string]$name ) return "Hello, $name! Welcome to MyModule." } Export-ModuleMember -Function Get-CustomGreeting # モジュールのインポートと使用 Import-Module -Name MyModule Get-CustomGreeting -name "User"
PowerShell Gallery
[編集]PowerShell Galleryからのモジュールのインストール
[編集]PowerShell Galleryは、公式のモジュールリポジトリです。モジュールを簡単にインストールできます。
Install-Module -Name ModuleName
NuGetを使ったパッケージ管理
[編集]NuGetは、.NETパッケージの管理に使用されるツールで、PowerShellでも利用できます。
# NuGetプロバイダーのインストール Install-PackageProvider -Name NuGet -Force -Scope CurrentUser # パッケージのインストール Install-Package -Name PackageName -Source NuGet
6. リモート管理
[編集]PowerShell Remoting
[編集]リモートセッションの設定
[編集]PowerShell Remotingを使用して、リモートコンピューター上でコマンドを実行できます。
# リモートセッションの作成 $session = New-PSSession -ComputerName RemoteComputerName # リモートコマンドの実行 Invoke-Command -Session $session -ScriptBlock { Get-Process } # リモートセッションの終了 Remove-PSSession -Session $session
リモートコマンドの実行
[編集]リモートコマンドを使用することで、ネットワーク越しに管理タスクを実行できます。
# 単一のコマンドをリモートで実行 Invoke-Command -ComputerName RemoteComputerName -ScriptBlock { Get-EventLog -LogName System }
WSManとSSHを使ったリモート管理
[編集]PowerShell Remotingは、WSManとSSHをサポートしています。これにより、Windows以外の環境でもリモート管理が可能です。
- WSManを使用したリモート管理
# WSManの設定 Enable-PSRemoting -Force # リモートセッションの作成 $session = New-PSSession -ComputerName RemoteComputerName -Authentication CredSSP
- SSHを使用したリモート管理
# SSHを使用したリモートセッションの作成 $session = New-PSSession -HostName RemoteHostName -UserName UserName -SSHTransport # リモートコマンドの実行 Invoke-Command -Session $session -ScriptBlock { hostname }