はじめに
配列は、一度に複数の値を保持できるデータ構造です。同じデータ型または異なるデータ型の要素を集めたコレクション、またはリストだと考えてください。配列は Windows PowerShell を含む多くのスクリプト言語やプログラミング言語で使用されます。
PowerShell で 配列を作成して使用する方法 について詳しく見ていきましょう。
オブジェクトの配列を作成する
デフォルトでは、配列内の各項目は文字列や整数のような別のデータ型ではなく、オブジェクトです。次は、オブジェクトを明示的に追加してオブジェクトの配列を作成する方法の例です:
$people = @(
[PSCustomObject]@{Name='Alice'; Age=30},
[PSCustomObject]@{Name='Bob'; Age=25}
要素が1つだけの配列を作成する
変数に値を1つだけ入れると、PowerShell は配列を作成しません。これを確認するために、2つのスクリプトを使ってそれぞれのデータ型を出力してみましょう。
まず、PowerShell で要素 5 つからなる配列を作成します:
$array = @(1, 2, 3, 4, 5)
$array1.GetType()
それでは、同様のスクリプトを使って要素 1 つの配列を作成してみましょう:
$array1 = 1
$array1.GetType()
下の出力から分かるように、PowerShell は最初の例のスクリプトでは配列(System.Array)を作成しましたが、2 つ目では作成していません。
特定のコマンドを実行してオブジェクトを取得し、その結果から配列を作成したい場合、この挙動は特に問題になり得ます。なぜなら、結果として何個のオブジェクトが返ってくるかを事前に把握できないからです。
この問題を回避するには、,(カンマ) 演算子を使うことができます。カンマが二項演算子として使われる場合は通常の配列が作成され、単項演算子として使われる場合は配列に要素が 1 つだけ入ります。
たとえば、要素が1つだけの配列を取得する方法は次のとおりです:
$array1 = ,1
$array1.GetType()
以下に示す出力で、配列の作成を確認できます:
空の配列を作成する
PowerShell では、演算子 @ を使って配列(空の配列を含む)を作成することもできます。@() を指定すると、オブジェクトがまったく含まれていない配列が得られます。変数を配列として初期化し、その後は数を気にせずに配列へオブジェクトを追加できるので便利です。
$array3 = @()
$array3.GetType()
強く型付けされた配列を作成する
通常、配列の要素には異なるデータ型を設定できます。しかし、単一の指定された型の値だけを受け付ける配列も作成できます。別の型の値を追加しようとするとエラーが発生します。最も一般的な強い型付け(strongly typed)配列の作り方は次のとおりです:
整数:
[int[]]$intArray = 1, 2, 3
文字列:
[string[]]$strArray = "one", "two", "three"
日付/時刻:
[datetime[]]$dateArray = (Get-Date), (Get-Date).AddDays(1)
多次元配列(マトリックス)の作成
カンマを使って配列をネストすることで、データを行または列として構造化して配置できます。ここでは 3×3 の行列を作成します:
$twoDArray = @(
@(1, 2, 3),
@(4, 5, 6),
@(7, 8, 9)
)
配列の比較・グループ化・選択・並べ替え
配列を扱うのに役立つその他の PowerShell コマンドレットには、次のものがあります。
- Compare-Object — 2つの配列を比較し、差分を返します。
- Group-Object — プロパティ値に基づいて配列要素をグループ化します。
- Select-Object — オブジェクト、または複数のオブジェクトの指定したプロパティを選択し、配列から特定数の要素を選択するためにも使用できます。
- Sort-Object — 下に示すように、1つのデータ型のみを含む配列を並べ替えるために使用します。
$array = @(3, 1, 4, 2)
$sortedArray = $array | Sort-Object
配列をループ処理する
配列内の各要素を順番に1つずつ処理するには、foreach 演算子を使ってループを作成する必要があります。たとえば、文字列配列を宣言して配列内の各単語の長さを数えたい場合は、次のスクリプトを実行します:
$array8 = @("Earth","Mercury","Venus","Jupiter","Saturn","Mars", "Neptune", "Pluto")
foreach ($array in $array8) {
"$array = " + $array.length
}
結果は次のようになります:
パイプラインを使用する
パイプラインは PowerShell で、あるコマンドの出力を別のコマンドへの入力として渡すために使用します。配列を扱うときは、パイプラインを使って配列内のデータを処理・操作し、結果を新しい配列に割り当てるか、既存の配列を変更できます。
ここでは、各配列要素を 2 倍します:
$numbers = 1,2,3,4,5
$doubled = $numbers | ForEach-Object { $_ * 2 }
配列に追加する
PowerShell の配列のサイズは、一度定義すると不変です。ただし、演算子 += を使うと、既存の配列に項目を追加して新しい配列を作成できます。つまり、新しい結合配列を作成するのと同等です。
$array = @(1, 2, 3)
$array += 4
ArrayList の作成
大きな配列や頻繁に追加する必要がある場合は += を使うと、パフォーマンス上の懸念が生じることがあります。というのも、使うたびに新しい配列が作成され、古い要素がコピーされてから、新しい要素が末尾に追加されるためです。そうした場合は、ArrayList の使用を検討してください。
ArrayList のサイズは可変なので、コレクション全体を作り直さずに項目を追加したり削除したりできます。標準の配列と同様に、ArrayList ではさまざまなデータ型の項目を保持できます。
ArrayList を作成するための cmdlet は次のとおりです:
$array3 = New-Object System.Collections.ArrayList
Netwrix Directory Manager の無料トライアルを申し込む
配列から要素を削除する
次に ArrayList を使って配列から要素を削除します。まず配列を作成しましょう。
$array5 = "one", "two", "three", "four", "five"
$array5.gettype()
次に、それを rrayList に追加します。そうすれば簡単に変更できます。
[System.Collections.ArrayList]$ArrayList1 = $array5
$ArrayList1.GetType()
次に .Remove コマンドを使います。
$ArrayList1.Remove("three")
配列をクリアする
配列を削除するための定義済みの方法はありませんが、配列の中身を取り除く(クリアする)方法はいくつかあります。その1つは、変数 $null を配列に割り当てることです:
$array7 = $null
$array7
配列をクリアする別の方法を紹介します:
$array = @("element1", "element2", "element3")
$array = @()
ArrayList をクリアする方法は次のとおりです:
$arrayList = New-Object System.Collections.ArrayList
$arrayList.Add("element1")
$arrayList.Add("element2")
$arrayList.Clear()
配列を出力する
配列の内容を表示する最も簡単な方法は、単に配列変数を参照することです。以下の例では、配列内の各項目の前にテキスト「Element:」を含める方法を示します:
.txt ファイルに書き込むには、 Out-File コマンドを使用します:
$var5 | Out-File C:scriptsarray.txt
.csv ファイルにエクスポートするには、 Export-Csv コマンドを使用します:
$var6 | Export-Csv -Path C:scriptsarray.csv
配列のフィルタリング
Where-Object コマンドレットを使って、配列から偶数だけを取得できます:
$numbers = 1,2,3,4,5,6
$evenNumbers = $numbers | Where-Object { $_ % 2 -eq 0 }
$evenNumbers
代わりに .Where() メソッドを使うこともできます。こちらはパイプラインを必要としません:
$numbers = 1,2,3,4,5,6
$evenNumbers = $numbers.Where({ $_ % 2 -eq 0 })
$evenNumbers
配列の長さを確認する
配列内の要素数を返すには .length パラメータを使用します:
$array6 = 1,2,3,4,5,6
echo $array6.Length
配列に特定の値が含まれているか確認する
配列内の要素のいずれかに特定の値が含まれているかどうかを確認したい場合は、Contains メソッドを使用します。このコードは、配列に 2 または 12 が含まれているかどうかを表示します:
$array7 = 1,2,5,8,3,4,5
$array7.Contains(2)
$array7.Contains(12)
配列インデックスを使用して要素にアクセスする
ほとんどのプログラミング言語と同様に、PowerShell の配列内の各要素はインデックスによってアクセスできます。配列のインデックスは 0 から始まるため、3 つの要素からなる配列では、最初の要素がインデックス 0、2 番目がインデックス 1、3 番目がインデックス 2 です。
配列インデックスを使って要素にアクセスするには、配列変数の後に角かっこでインデックスを指定する必要があります。以下は、2 番目の要素を表示する配列を作成する方法の例です:
$colors = "Red", "Green", "Blue", "Yellow"
$secondColor = $colors[1]
Write-Output $secondColor
負のインデックスを使うことで、配列の末尾から要素にアクセスできます。-1 は最後の要素を、-2 は最後から 2 番目の要素を指します。
Join 演算子と Split 演算子を使う
PowerShell では、join 演算子は、文字列の配列を単一の文字列に連結するために使用します。必要に応じて、指定した区切り文字(delimiter)を使うこともできます。区切り文字を使わない例を示します。
$array = "Power", "Shell"
$joined = $array -join ""
# Output: "PowerShell"
区切り文字を使うと次のようになります:
split 演算子は基本的に join 演算子の反対の動作を行います。以下の例をご覧ください:
$string = "apple,banana,grape"
$fruits = $string -split ","
Replace 演算子の使用
replace 演算子は、ある文字列を別の文字列に置き換えるために使用します。cmdlet の構造は次のとおりです:
<originalString> -replace <patternToFind>, <replacementString>
次の例では、「Hello World」を「PowerShell」に置き換えます:
$string = "Hello World"
$newString = $string -replace "World", "PowerShell"
配列のスライス
範囲を指定することで、ここに示すようにサブ配列を作成できます:
$array = 1,2,3,4,5,6,7,8,9
$subset = $array[3..6]
配列の反転
配列内の要素の順序を反転する方法の例です:
$numbers = 1..5
[Array]::Reverse($numbers)
結論
配列は、多くのスクリプト言語やプログラミング言語における基本的なデータ構造です。配列を使うことで、さまざまなデータ型の項目の集合を保存・取得・操作できるためです。配列を理解することで、PowerShell を使ったタスクの自動化能力が高まります。
いま Netwrix が支援します
より効率的かつ効果的に Active Directory と Entra ID (Azure AD) 環境を保護する必要がありますか? Netwrix Directory Manager を検討してみてください。自動化されたグループおよびユーザー管理機能により data breach のリスクを低減し、時間を浪費する手作業の管理業務をなくします。
Netwrix Directory Manager で、次のことが可能になります:
- HR情報システム(HRIS)から Active Directory、Entra ID、SCIM 対応アプリケーションまでのユーザーのプロビジョニング/プロビジョニング解除を自動化し、 新入社員がすぐに生産的に働けるようにするとともに、攻撃者が古い(使われていない)アイデンティティを乗っ取るリスクを大幅に低減します。
- HRIS に記録された従業員の昇進や別の職務への異動などの変化に応じて、ディレクトリ グループを自動的に更新します。これにより、セキュリティとコンプライアンスに必要な形で、アクセス権をほぼリアルタイムで最新の状態に保ちながら、IT チームの工数も削減できます。
- グループおよびユーザー管理は、「誰が何にアクセスすべきか」を把握している人に委任してください。シンプルなワークフローにより、部門のオーナーが自分のグループを確認し、ユーザーのアクセス要求を承認または却下できます。これにより、ディレクトリ内に過剰な特権を持つグループやユーザーが存在するリスクを低減します。
- ユーザーの作成・有効期限・削除を自動化することで、ディレクトリをクリーンに保ち、管理をより簡単にします。
- 深い可視化、効果的な自動化、そしてグループとメンバーに関するわかりやすいレポートにより、規制や標準へのコンプライアンスを維持し、証明します。
Windows PowerShell スクリプト作成の基礎をマスターしよう
詳しく見る共有する
もっと詳しく
著者について
Jonathan Blackwell
ソフトウェア開発責任者
2012年以降、エンジニアでありイノベーターである Jonathan Blackwell は、エンジニアリングのリーダーシップを通じて Netwrix GroupID を、Active Directory および Azure AD 環境におけるグループとユーザー管理の最前線に押し上げてきました。開発、マーケティング、営業での経験により、Jonathan は Identity 市場と買い手の考え方を深く理解できています。