PowerShell 基礎ガイド

PowerShell 基礎

  • PowerShell 基礎
  • 概要
  • 基本的な使い方
  • PowerShell コマンドレット
  • ヘルプの取得方法
  • PowerShell エイリアスとパラメータ
  • PowerShell スクリプトの作成
  • 基本概念
  • 変数
  • 演算子
  • パラメータ
  • 分岐構造
  • フロー制御
  • PowerShell 実行ポリシー

概要

最初の Windows PowerShell.NET Framework に基づいて構築され、Windows オペレーティングシステムでのみ実行できました

しかし、最近のバージョンでは、PowerShell は .NET Core を使用するようになり、Windows、macOS、Linux プラットフォームで実行できるようになりました

マルチプラットフォーム対応により、これらの最新バージョンは Windows PowerShell ではなく単に PowerShell と呼ばれるようになりました

Windows PowerShell は、Windows コマンドラインインターフェース (cmd.exe) とそのバッチファイルスクリプト言語の限定的な機能に取って代わりました

  • コマンド履歴
  • Tab 補完と予測入力
  • コマンドとパラメータのエイリアスサポート
  • パイプ機能を使用したコマンドの連結
  • 信頼できるコンソール内ヘルプシステム

Windows PowerShell と比較して、最新バージョンの PowerShell をインストールすると、以下のような結果が得られます:

  • 独立したインストールパスと実行ファイル名

  • Windows PowerShell 5.1 は $env:WINDIR\System32\WindowsPowerShell\v1.0 にインストールされ、実行ファイル名は powershell.exe です

  • PowerShell 7 は $env:ProgramFiles\PowerShell\7 にインストールされ、バージョン6以降の実行ファイル名は pwsh.exe です

  • 各バージョン独立した設定ファイル

  • Windows PowerShell 5.1 では設定ファイルの場所は $HOME\Documents\WindowsPowerShell です

  • PowerShell 7 では設定ファイルの場所は $HOME\Documents\PowerShell です

  • 独立した PSModulePath: Windows PowerShell と PowerShell 7 はモジュールを異なる場所に保存します

  • 独立したイベントログ: Windows PowerShell と PowerShell 7 はイベントを記録して Windows イベントログを分離します

$PSVersionTable を使用してインストールを確認します

Name                           Value
----                           -----
PSVersion                      7.1.4
PSEdition                      Core
GitCommitId                    7.1.4
OS                             Linux 5.4.0-1058-azure #60~18.04.1-Ubuntu SMP Tue Aug 31 20:34:4…
Platform                       Unix
PSCompatibleVersions           {1.0, 2.0, 3.0, 4.0…}
PSRemotingProtocolVersion      2.3
SerializationVersion           1.1.0.1
WSManStackVersion              3.0

  • $PSVersionTable.<Name> を使用してさらに詳細な情報にアクセスできます。例: $PSVersionTable.PSVersion

基本的な使い方

PowerShell コマンドレット

コマンドレット(「コマンドレット」と発音)はコンパイル済みのコマンドです。以下の3つの主要なコマンドレットは、利用可能なコマンドレットとその機能を理解するのに役立ちます:

  • Get-Command: Get-Command cmdlet はシステム上のすべての利用可能なコマンドレットをリストし、必要なコマンドを迅速に見つけるためにリストをフィルタリングします
  • Get-Help: 組み込みのヘルプシステムを呼び出します。エイリアス help コマンドを実行して Get-Help を呼び出すこともできます。一般的には Get-Help -Name <cmdlet> を使用します
  • Get-Member: コマンドを実行すると、応答は複数のプロパティを含むオブジェクトになります

PowerShell コマンドレットで使用される一般的な形式は Verb-Noun 表記法です

  • Verb: 動作を理解するもので、コマンドレットが実行する操作を示します

  • Get: リソースを検索します

  • Set: リソースに関連するデータを変更します

  • New: リソースを作成します

  • Add: リソースを複数のリソースコンテナに追加します

  • Remove: リソースを複数のリソースコンテナから削除します

  • Noun: コマンドレットが影響を与えるリソースまたはオブジェクトのタイプ

  • 同じリソースに対して実行されるすべてのコマンドレットは、同じ名詞を使用する必要があります

  • 名詞には関連する名詞をシリーズでグループ化するのに役立つ接頭辞を含めることもできます

コマンドレットのパラメータ

  • パラメータ名はハイフン (-) で始まります
  • パラメータ名から渡す値を区切るにはスペースを使用します
  • 渡す値にスペースが含まれる場合は、引用符でテキストを囲む必要があります
  • 一部のパラメータは複数の値を受け入れ、これらの値は ,(スペースなし)で区切る必要があります
  • パラメータはオプションまたは必須のいずれかです。必須パラメータの場合、コマンドレットを実行時にその値が提供されていないと、PowerShell は値の入力を求めます

Get-Command の例、検索/検索【コマンド】リソース

# ファイル関連のコンテンツを検索、あいまい一致をサポート
Get-Command -Noun File*

# 応答をさらに絞り込む
Get-Command -Verb Get -Noun File*

ヘルプの取得方法

デフォルトでは、PowerShell の新しいバージョンにはヘルプシステムが含まれていません

  • Get-Help を初めて実行すると、ヘルプファイルのインストールを求められます
  • Update-Help コマンドレットを実行してヘルプファイルをインストールできます
# コマンドレットのヘルプ情報を取得: Get-Help -Name <cmdlet>
Get-Help -Name Get-Help

# Update-Help でヘルプドキュメントを更新、このコマンドは管理者として実行する必要があります
#   -Force              この抽出動作を上書きします(Update-Help コマンドは1日に1回のみ抽出できます)
#   -UICulture          言語を指定できます
#   -Verbose            更新されたヘルプドキュメントのリストを取得
Update-Help -UICulture ja-JP -Verbose

Get-Help の出力結果

  • NAME: コマンドの名前を提供します
  • SYNTAX: フラグの組み合わせ(場合によっては許可されたパラメータを使用)を使用してコマンドを呼び出す方法を紹介します
  • ALIASES: コマンドのすべてのエイリアスをリストします
  • REMARKS: コマンドを実行してこのコマンドに関する詳細なヘルプを取得するための情報を提供します
  • PARAMETERS: パラメータに関する詳細情報を提供します

Get-Help コマンドを実行すると、ヘルプ全体が返されます。このページは最適な読み取り体験を提供しない可能性があります

読みたいセクションを見つけるためにスクロールする必要があるかもしれません。より良い方法は help エイリアスを使用することです

Get-Member を使用して出力を確認する

  • Get-Member に渡すオブジェクトのタイプ
  • 計算可能なオブジェクトのプロパティ
  • 実行可能なオブジェクトのメソッド
# Get-Process を呼び出してオブジェクト結果を生成し、パイプで Get-Member に渡す
# 返される結果には、Name、MemberType、Definition 列を含むテーブルが表示され、返されるオブジェクトのタイプも取得されます
Get-Process -Name 'process-name' | Get-Member

# Select-Object を使用して Get-Member の結果をフィルタリング
Get-Process -Name 'process-name' | Get-Member | Select-Object Name, MemberType

# Sort-Object は昇順または降順でソートされます
#   -Descending         降順
#   -Property           列をフィルタリング
Get-Process | Sort-Object -Descending -Property Name, CPU

PowerShell エイリアスとパラメータ

エイリアスは、元のコマンドで使用されるパラメータを通常サポートしないことに注意してください

Get-Alias <cmdlet> を使用すると、エイリアス、エイリアス定義、および実行されるコマンドを発見できます

  • Get-Help -Name Get-Alias をお勧めします
  • PowerShell には古いバッチと Linux コマンドのエイリアスが含まれています
  • パラメータなしの Get-Alias は、定義されたすべてのエイリアスを返します
  • -Name パラメータ: 位置パラメータで、特定のエイリアス定義を見つけるためのワイルドカードを受け入れます

New-Alias <cmdlet> を使用してカスタムエイリアスを作成します。注意: カスタムエイリアスは Windows PowerShell セッション間で保存されません。保存するには、Windows PowerShell 設定ファイルを使用してエイリアスを再作成する必要があります

PowerShell スクリプトの作成

PowerShell は抽象構文木 (AST) にコンパイルされ、最初にメモリ内で、次に実行されます

  • しかし、PowerShell を使用するために、ここで深く研究する必要はありません
  • 知っておく必要があるのは、コンピュータが主要な問題を検索する際に最初に AST のコードを確認することです
  • 問題がなければ、プログラムはコンピュータによって実行され、コンパイルされた実行ファイルは不要です

最も基本的なプログラムでも、以下の1つまたは複数のタスクを実行できます:

  • ソースからの入力を受け取る
  • 情報を処理する
  • 結果を出力する

New-Item コマンドは、現在のディレクトリに新しい .ps1 ファイルを作成します(.ps1 ファイル拡張子は PowerShell スクリプトに使用される拡張子です)

New-Item HelloWorld.ps1

ファイルに以下の内容を書き込み、./HelloWorld.ps1 を実行します

# Read-Host         入力、bash の read に似ています
#   -Prompt         入力プロンプト
#
# Write-Output      出力、bash の echo に似ています
$name = Read-Host -Prompt "名前を入力してください"
Write-Output "おめでとうございます $name! PowerShell で最初のコードを書きました!"

bash スクリプトについて

基本概念

まず、PowerShell スクリプト言語(大文字と小文字を区別しない)の構成要素を概観しましょう:

  • 変数: 変数を使用して値を保存し、変数をコマンドのパラメータとして使用できます
  • 式: PowerShell スクリプトで式を頻繁に使用します
  • 関数: 関数はステートメントの名前付きリストです
  • フロー制御: フロー制御は、If、ElseIf、Else などの構造を使用してさまざまな実行パスを制御する方法です
  • ループ: ループは、配列を操作し、各項目をチェックし、各項目に対して何らかの操作を実行できる構造です
  • エラーハンドリング: スクリプト作成では、信頼性とさまざまなタイプのエラーを処理する能力が重要です
  • .NET.NET Core 統合: PowerShell は .NET と .NET Core との強力な統合を提供します

PowerShell は、主に2つの方法で、意図しない操作の実行を防ごうとします:

  • スクリプトを実行するために完全パスまたは相対パスの使用を要求します
  • 実行ポリシー

変数

変数を定義するには、その前に $ 文字を付けます。変数を使用する(引用符と補間)

# 変数を定義
$PI = 3.14

# 補間するには二重引用符を使用します。バッククォート (`) を使用すると補間を回避できます
Write-Host 'Here is $PI' # Prints Here is $PI
Write-Host "Here is `$PI and its value is $PI" # Prints Here is $PI and its value is 3.14

# 二重引用号内で式を記述
Write-Host "An expression $($PI + 1)" # Prints An expression 4.14

スコープ

  • グローバルスコープ: このスコープで変数のような構造を作成すると、セッションが終了しても存在し続けます
  • スクリプトスコープ: スクリプトファイルを実行すると、スクリプトスコープが作成されます
  • ローカルスコープ: ローカルスコープは現在のスコープで、グローバルスコープまたは他の任意のスコープになります

プロファイルファイルは、PowerShell が起動時に実行されるスクリプトです

  • すべてのユーザー、すべてのホスト: $PSHOME\Profile.ps1
  • すべてのユーザー、現在のホスト: $PSHOME\Microsoft.PowerShell_profile.ps1
  • 現在のユーザー、すべてのホスト: $Home[My ]Documents\PowerShell\Profile.ps1
  • 現在のユーザー、現在のホスト: $Home[My ]Documents\PowerShell\Microsoft.PowerShell_profile.ps1

ここには2つの変数があります: $PSHOME は PowerShell のインストールディレクトリを指し、$Home は現在のユーザーのホームディレクトリです

$Profile | Select-Object \* を実行して、プロファイルのタイプとそれらに関連付けられたパスを確認できます

演算子

PowerShell には、値を比較するか、特定のパターンに一致する値を検索するために使用される多くの論理演算子が含まれています

演算子 定義
-eq 等しい
-ne 等しくない
-gt より大きい
-ge 以上
-lt より小さい
-le 以下
-Like \* ワイルドカードを使用して一致
-NotLike \* ワイルドカードを使用しない一致
-Match 指定された正規表現に一致
-NotMatch 指定された正規表現に一致しない
-Contains コレクションに指定された値が含まれるかどうかを判断
-NotContains コレクションに特定の値が含まれないかどうかを判断
-In 指定された値がコレクションにあるかどうかを判断
-NotIn 指定された値がコレクションにないかどうかを判断
-Replace 指定された値を置換

パラメータ

いくつかのスクリプトを作成すると、スクリプトが柔軟でないことに気づくかもしれません。パラメータを使用すると、ユーザーがオプションを選択したり、入力をスクリプトに送信したりできるため、スクリプトが柔軟になります

# パラメータを宣言するには、キーワード Param と括弧のペアを使用します
Param (
  $Path
)
New-Item $Path
Write-Host "File $Path was created"

コマンドラインで ./CreateFile.ps1 -Path './newfile.txt' を使用して上記をテストします

スクリプトの安全性を高めるためにいくつかの方法を使用できます。パラメータ値をチェックするためのカスタムコードを記述できます

  • If/Else を使用する
Param(
    $Path
)

# $Path に値が提供されていない場合、スクリプトは Write-Error を実行します
If (-Not $Path -eq '') {
    New-Item $Path
    Write-Host "File created at path $Path"
} Else {
    Write-Error "Path cannot be empty"
}

  • Parameter[] 修飾子を使用する
Param(
    [Parameter(Mandatory, HelpMessage = "Please provide a valid path")]
    $Path
)
New-Item $Path
Write-Host "File created at path $Path"

  • 型を割り当てる
Param(
    [string]$Path
)

これら3つの方法は相互に排他的ではなく、組み合わせてスクリプトをより安全にすることができます

分岐構造

If-ElseIf-Else を使用して入力と実行フローを管理します

PowerShell には、式が True か False かを判断するための2つの組み込みパラメータがあります:

  • $True は式が True であることを示します
  • $False は式が False であることを示します
# _FullyTax.ps1_
# 可能な値: 'Minor', 'Adult', 'Senior Citizen'
$Status = 'Minor'
If ($Status -eq 'Minor')
{
    Write-Host $False
} ElseIf ($Status -eq 'Adult') {
    Write-Host $True
} Else {
    Write-Host $False
}

エラーハンドリング

  • Try-Catch-Finally を使用してエラーを管理します
Try {
    # 実行するコード
} Catch [System.IO.IOException] {
Write-Host "Something went wrong"
}  Catch {
    # エラーが発生した場合、このキーワードを使用してエラーをキャッチまたは管理します
} Finally {
    # エラーが発生してもしなくても、このブロック内のステートメントは実行されます
}

  • エラーを発生させます
# 終了しないエラー、-ErrorAction などのパラメータを使用して発生させることができます
Try {
    Get-Content './file.txt' -ErrorAction Stop
} Catch {
    Write-Error "File can't be found"
}

# ビジネスルール、Throw ブロックを使用します
# 通常、パラメータ検証には Throw を使用しないでください
Try {
    If ($Path -eq './forbidden'){
        Throw "Path not allowed"
    }
} Catch {
    Write-Error "$($_.exception.message)" # Path not allowed.
}

フロー制御

ForEach-Object は、パイプ内の項目を反復処理するコマンドレットです

# ForEach-Object はパイプでオブジェクトをストリーミングします
# '|' はパイプで、シェル一般の特性であり、常識です
# $_ は現在のオブジェクトを表します
'ActiveDirectory', 'SQLServer' |
    ForEach-Object {Get-Command -Module $_} |
        Group-Object -Property ModuleName -NoElement |
            Sort-Object -Property Count -Descending

# foreach キーワードもあります
# しかし、foreach はすべての項目をメモリに保存してから反復処理する必要があり、処理する項目数がわからないと困難な操作になる可能性があります
$ComputerName = 'DC01', 'WEB01'
foreach ($Computer in $ComputerName) {
    Get-ADComputer -Identity $Computer
}

for ループは反復処理を行います

for ($i = 1; $i -lt 5; $i++) {
    Write-Output "Sleeping for $i seconds"
    Start-Sleep -Seconds $i
}

do-untildo-while は条件比較部分が逆です

# 指定された条件が false の場合、do-until は実行されます
$number = Get-Random -Minimum 1 -Maximum 10
do {
    $guess = Read-Host -Prompt "What's your guess?"
    if ($guess -lt $number) {
        Write-Output 'Too low!'
    }
    elseif ($guess -gt $number) {
        Write-Output 'Too high!'
    }
}
until ($guess -eq $number)

# 指定された条件が true の場合、do-while は実行されます
$number = Get-Random -Minimum 1 -Maximum 10
do {
    $guess = Read-Host -Prompt "What's your guess?"
    if ($guess -lt $number) {
        Write-Output 'Too low!'
    } elseif ($guess -gt $number) {
        Write-Output 'Too high!'
    }
}
while ($guess -ne $number)

制御: break、continue、return

# break はループを中断することを目的としています
for ($i = 1; $i -lt 5; $i++) {
    Write-Output "Sleeping for $i seconds"
    Start-Sleep -Seconds $i
    break
}

# continue はループの次の反復にスキップすることを目的としています
while ($i -lt 5) {
    $i += 1
    if ($i -eq 3) {
        continue
    }
    Write-Output $i
}

# return は現在のスコープから退出することを目的としています
$number = 1..10
foreach ($n in $number) {
    if ($n -ge 4) {
        Return $n
    }
}

PowerShell 実行ポリシー

PowerShell の実行ポリシーは、ユーザーが意図せず PowerShell スクリプトを実行する可能性を最小限に抑えることを目的としています

これを、PowerShell が設定ファイルをロードし、スクリプトを実行する条件を制御するためのセキュリティ機能と考えることができます

現在の PowerShell セッションの有効な実行ポリシーを識別するには、次のコマンドレットを使用します: Get-ExecutionPolicy

次のポリシー設定を構成できます:

  • AllSigned: すべての署名済みスクリプトのスクリプト実行を制限します

この設定では、すべてのスクリプトが信頼できる発行者によって署名されている必要があります、ローカルコンピュータで作成されたスクリプトを含みます。それは、信頼できるか信頼できないかまだ分類されていない発行者からのスクリプトを実行する前に、あなたにプロンプトを表示します。しかし、スクリプトの署名を検証しても、そのスクリプトが悪意のあるスクリプトである可能性を排除することはできません。それは、その可能性を最小限に抑えるための追加のチェックを提供するだけです

  • Default: デフォルトの実行ポリシーを設定します

  • Windows クライアントの場合: Restricted

  • Windows サーバーの場合: RemoteSigned

  • RemoteSigned: スクリプトの実行を許可しますが、このポリシーは、信頼できる発行者がインターネットからダウンロードしたスクリプトと設定ファイルにデジタル署名することを要求します。注: 「この設定では、ローカルコンピュータで作成されたスクリプトのデジタル署名は不要です」

  • Restricted: 単一のコマンドの実行を許可しますが、スクリプトの実行は許可しません

  • Unrestricted: これは Windows 以外のコンピュータのデフォルトの実行ポリシーで、変更することはできません。これは署名されていないスクリプトの実行を許可し、このポリシーは、ローカル Intranet ゾーンからではないスクリプトと設定ファイルを実行する前にユーザーに警告を発します

  • Undefined: 現在のスコープで実行ポリシーが設定されていないことを示します

すべてのスコープで実行ポリシーが Undefined の場合

  • Windows クライアントの場合、有効な実行ポリシーは Restricted です
  • Windows サーバーの場合は RemoteSigned です

PowerShell での実行ポリシーの変更には、次のコマンドを使用します: Set-ExecutionPolicy -ExecutionPolicy <PolicyName>

詳細を学びたい場合は -> 公式ドキュメント

タグ: PowerShell スクリプト コマンドレット Windows管理 .NET Core

6月1日 04:13 投稿