はじめに
PowerShell の変数は、値が割り当てられるコンテナです。保持します。変数は、あとで使うための情報を入れておける「名前付きの箱」のようなものだと考えてください。変数の値は、変数を参照するだけで簡単に取得でき、また、新しい値を使って変数に再代入することで、いつでも変更できます。変数は、スクリプト内や PowerShell セッション中にデータを管理・追跡するのにとても便利です。
PowerShell 変数の例
PowerShell で変数を使うための、最も便利な方法をいくつか見ていきましょう。
PowerShell で変数を作成して設定する
PowerShell の変数名はドル記号($)で始まり、大文字と小文字は区別されません。たとえば $VAR と $var は同じ変数を指します。変数名には、英字、数字、アンダースコアを含めることができます。空白やその他の特殊文字を含めることも可能ですが、避けるのが最善です。
PowerShell の変数に名前を付けると、その変数を作成して値を1つのコマンドで割り当てることができます。たとえば、変数名が $Greeting で、文字列の値 Hello, World を割り当てたい場合は、このコマンドを使用します:
$Greeting = "Hello, World"
このコマンドの後は、$Greeting と入力するたびに、下に示すように PowerShell がその変数に割り当てた値を置き換えます。
前の例にある二重引用符(“ ”)は、その値が文字列であることを示しています。変数を作成し、整数値を割り当てる方法は次のとおりです:
$var1 = 75
$var2 = 25
以下のように、数値変数で算術演算を行うことができます:
さらに、プラス記号(+)演算子を使って文字列を結合することもできます:
$var10 = “Complete”
$var11 = “Visibility
$var12 = $var10 + $var11
文字列に数値を追加すると、その数値は自動的に文字列になります:
$var1 = “Netwrix”
$var2 = 2023
変数の型を設定または確認する
PowerShell の変数は、文字列、整数など複数のデータ型を格納でき、配列のようなより複雑なオブジェクトも扱えます。変数に値を代入すると、PowerShell はその値に基づいてデータ型を自動的に判断します。これはダイナミック型付け(dynamic typing)として知られています。上で述べたとおり、文字列には引用符が必要です。
いくつかの例を示します:
$var1 = "Hello" # The type of $var1 is String
$var2 = 25 # The type of $var2 is Integer
$var3 = Get-Date # The type of $var3 is DateTime
変数がどの型かを調べるには、GetType パラメータを使用します:
$var5 = “Netwrix”
$var5.GetType () .FullName
最も一般的な変数タイプには、次のものがあります:
- String:テキスト(引用符で囲むことで文字列を宣言できます)
- Integer:整数(小数を含まない数)
- Double:小数点を含む数値
- Boolean:真偽値($True または $False)
- DateTime:日付と時刻
- Array:同じ種類または異なる種類の項目をまとめて保持するデータ構造です。項目は順番に格納され、インデックスでアクセスできます。配列を宣言する例は次のとおりです:
$myArray = "apple", "orange", "cherry"
- HashTable: キーと値のペアを順不同で集めたデータ構造です。各値を保存したり取得したりするために、一意のキーを使う辞書のようなものです。これにより、ハッシュテーブルは検索(ルックアップ)に優れており、値を簡単に探す必要があるシナリオに適しています。ハッシュテーブルを作成するには、次を使用します @{} 。中かっこ内では、各ペアを「キー + 等号(=)+ 値」の順で指定します(この例のように記述します):
$myHashtable = @{
"Fruit1" = "Apple"
"Fruit2" = "Orange"
"Fruit3" = "Cherry"
}
変数のスコープを定義する
スコープとは、変数の可視性とアクセス可能性のことです。PowerShell にはいくつかの異なるスコープがあります:
- ローカル — 現在のスコープ
- グローバル —PowerShell の起動時、または新しいセッションや runspace を作成したときに有効になるスコープ
- スクリプト — スクリプトが実行されている間に作成されるスコープ
変数は PowerShell で次のように指定します:
$global:Var1 = "Global Variable"
$script:Var2 = "Script Variable"
$local:Var3 = "Local Variable"
Netwrix Directory Manager でタスクを自動化
複雑な PowerShell スクリプトなしで、グループ管理を簡素化しタスクを自動化
パブリック変数とプライベート変数
変数の Visibility プロパティはスコープ(scope)に関連しており、作成したスクリプトの外でその項目を参照できるかどうかを決定します。変数の Visibility プロパティには Public または Private の値を指定できます。プライベート(Private)変数は、それが作成されたスコープ内でのみ表示および変更できます。パブリック(Public)変数は、どのスコープからでもアクセスできます。
現在のスコープ内の変数を一覧表示(取得)
PowerShell セッションで現在のすべての変数を一覧表示するには Get-Variable コマンドレットを使用します。これは現在のスコープ内のすべての変数を取得します。下の例では、前の例で使用されたいくつかの変数を示します。
変数を表示する
変数を .txt、.csv、または HTML ファイルに出力できます。
.txt ファイルに書き込むには、Out-File コマンドを使用します:
$var5 = “Hello World”
$var5 | Out-File c:scriptsHello_World.txt
データを .csv ファイルにエクスポートするには、Export-Csv コマンドを使用します:
$var6 = Get-Process
$var6 | SELECT Name, Path | Export-Csv -Path c:scriptsprocesses.csv
また、HTML ファイルに書き込むには、ConvertTo-Html コマンドを使用します:
$var6 = Get-Process
$var6 | ConvertTo-HTML -Property Name, Path>C:scriptprocesses.html
エクスポートしたファイルを読み取るには、Get-Content cmdlet を使用します:
Get-Content c:\scripts\processes.csv
変数をクリアする
Clear-Variable の cmdlet は、変数から値を削除するために使用しますが、変数オブジェクト自体は残します。変数をクリアすると、変数は引き続き存在しますが、その値は $null になります。以下の例では、変数が作成され、その後クリアされ、各操作が確認されます。
変数を削除する
Remove-Variable の cmdlet は、変数とその値を削除するために使用します。
次の例では、Example という変数を作成し、文字列「Hello World!」を割り当てます。その後、Remove-Variable の cmdlet でその変数が削除されます。続いてスクリプトが変数を確認し、存在しなくなっているためエラーを返します。
次の点に注意してください。Remove-Variable コマンドレットは、現在のスコープにある変数のみを削除します。同じ名前の変数が親スコープ(parent scope)に存在する場合、その変数には影響しません。同様に、Remove-Variable は、同じ名前の変数を含んでいる可能性のある子スコープ(child scopes)には影響しません。
Clear-Variable と Remove-Variable コマンドの違いは、変数をクリアすると変数の値のみが削除されるのに対し、削除(remove)すると変数自体が削除される点です。
パラメーター
上で説明したコマンドレットはいくつかのパラメーターを使用します。最も役立つパラメーターと、それらがどのように機能するかを確認しましょう。
説明
PowerShell の変数には Description プロパティがあり、Set-Variable の cmdlet に Description パラメーターを指定して設定できます:
Set-Variable -Name "myVariable" -Description "This is my sample variable"
除外
Get-Variable の cmdlet を使用するときに特定の変数を除外するには、Exclude パラメーターを使用し、除外する変数名を指定します。下の例では 4 つの変数を作成します。その後、Get-Variable -Exclude コマンドを使用して、そのうち 2 つを除外します。
$Var1 = "Test1"
$Var2 = "Test2"
$Var3 = "Test3"
$OtherVar = "Other"
Get-Variable -Exclude Var1, OtherVar
(特定の変数だけを含めるには、以下で説明する Name パラメーターを使用します。)
強制
一部のコマンドでは Force パラメーターを使用できます。たとえば Set-Variable と Remove-Variable のように指定すると、コマンドの完了を妨げる可能性のある制限を上書きできます。
たとえば、通常は読み取り専用変数の値を変更しようとすると、以下のようにエラーになります。
ただし、この動作は Force パラメーターで上書きできます:
名前
ドル記号を付けずに、変数名によって変数を参照するには Name パラメーターを使用できます。特に、特定のパターンに一致する名前の変数だけを取得するために使えます。たとえば、以下の cmdlet を使用すると、名前が “Net” で始まる変数だけを取得できます:
Get-Variable -Name "NET*"
アスタリスク(*)はワイルドカード文字で、任意の数の追加文字を表します。
オプション
Option パラメーターは Set-Variable の cmdlet で指定できます。このパラメーターで使用できる値は次のとおりです。
- なし (既定値):変数は通常の変数として動作します。
- ReadOnly: 変数は変更または削除できません。
- Constant:変数は Force パラメーターを使用しても、変更または削除できません。
- Private:変数は現在のスコープ内でのみ使用可能です。
- AllScope:変数は、新しく作成されるすべてのスコープにコピーされます。
ReadOnly オプションの例をこちらに示します:
PassThru
デフォルトでは、動作を実行するほとんどの cmdlet(たとえば Set-Variable、 New-Item および Remove-Item)は何も出力しません。単に、その操作を静かに完了するだけです。 ただし PassThru パラメーターを使用すると、cmdlet はその cmdlet で操作した項目を表すオブジェクトを出力します。
次は、 PassThru と Set-Variable を組み合わせて使う例です:
WhatIf
次のような変更を行う cmdlet に対して WhatIf パラメーターを使い、実際の変更を行わずに cmdlet を実行した場合に何が起きるかを確認できます。例として Set-Variable、 Remove-Variable、または Clear-Variable があります。これは、cmdlet が何を行うのかよく分からないときに便利です。例を以下に示します:
結論
PowerShell の変数がどのように作成され、どのように操作できるかをしっかり理解することで、タスクの自動化、システム管理、ソフトウェア開発などを支援する PowerShell スクリプトを作成できます。
Netwrix ができること
「Active Directory」と Entra ID (Azure AD) 環境を、より効率的かつ効果的に保護する必要がありますか? Netwrix Directory Manager を検討してください。自動化されたグループおよびユーザー管理機能により、data breach のリスクを低減し、時間のかかる手作業の管理タスクもなくせます。
Netwrix Directory Manager は、次のことを可能にします。
- HR 情報システム(HRIS)から Active Directory、Entra ID、SCIM 対応アプリケーションへのユーザーのプロビジョニングおよびデプロビジョニングを自動化することで、新入社員がすぐに戦力として活躍できるようにしつつ、攻撃者が古い(有効期限が切れた/放置された)IDを乗っ取るリスクを大幅に低減します。
- HRIS に記録された従業員の昇進や別の役割への異動などの変更に基づいて、ディレクトリ グループを自動的に更新します。この自動化により、セキュリティとコンプライアンスに必要な形で、アクセス権をほぼリアルタイムで最新の状態に保ちながら、IT チームの作業時間も節約できます。
- 「誰が何にアクセスすべきか」を理解している人に、グループとユーザー管理を委任します。シンプルなワークフローにより、部門(ラインオブビジネス)のオーナーが自分のグループを確認し、ユーザーのアクセス要求を承認または却下できるため、ディレクトリ内に権限過多のグループやユーザーが存在するリスクを低減できます。
- 自動化されたユーザー作成、期限切れ、削除により、ディレクトリをクリーンに保ち、管理をより簡単にします。
- 深い洞察、効果的な自動化、そしてグループとメンバーに関する明確なレポートにより、規制や標準への準拠を維持し、証明します。
初心者向け Windows PowerShell スクリプト入門チュートリアル
詳しくはこちら共有する
もっと詳しく
著者について
Jonathan Blackwell
ソフトウェア開発責任者
2012年以降、エンジニアでありイノベーターである Jonathan Blackwell は、エンジニアリングのリーダーシップを通じて Netwrix GroupID を、Active Directory および Azure AD 環境におけるグループとユーザー管理の最前線に押し上げてきました。開発、マーケティング、営業での経験により、Jonathan は Identity 市場と買い手の考え方を深く理解できています。