こんにちは。チェシャ男です。(-皿-)
本連載「PowerShell で配列デビュー」の第1回!PowerShell でスクリプトを作成するとなれば避けては通れない配列ですが、厳密な話をするとなるとかなり小難しい内容なので、
”まずは配列を使えるようになること”
を目標に解説していきます。
もくじ
配列について
PowerShell で配列を学ぶために、まずは「配列とは」何を指すのかという説明から入ります。
あなたが、
”配列という言葉は聞いたことがあっても、それが何なのかわからない”
という場合は、この説明から読んでみてください。
配列とは…
配列とは、
複数のデータ(要素)の集まりを格納するためのデータ構造
のことを指します。格納する複数のデータを”要素”、要素を表す識別子を”添字(インデックス)”と言います。”配列”の説明はこれに尽きるのですが、の変数と配列の違いがわかっていないかもしれません。わかりやすいように具体例を挙げて説明してみます。好きな食べ物を例に考えてみましょう。
まずは、変数の動きです。
- 好きな食べ物 は つけ麺
- 好きな食べ物 = つけ麺
- $好きな食べ物 = ”つけ麺”
好きな食べ物に対し、1つの料理名を当てはめていますね。これが、”通常の変数”の考え方です。
では、
「好きな食べ物を1つに絞れないよ!」という場合はどうでしょうか。
- 好きな食べ物 は つけ麺 と ラーメン と 坦々麺
- 好きな食べ物 = つけ麺 , ラーメン , 坦々麺
- $好きな食べ物 = @(つけ麺 , ラーメン , 坦々麺)
このように、好きな食べ物に複数の料理名を当てはめた考え方、これが”配列”の考え方です。(この ”@” は、「配列ですよ」を意味します)
「好きな食べ物」という配列に、「つけ麺,ラーメン,坦々麺」といった要素が格納されていますよね。
また、
好きな食べ物(配列) の 1つめ(添字) は つけ麺(要素)
→ 好きな食べ物[ 1] = “つけ麺”
のように、インデックスを使って要素を参照することができます。これが、”配列”です。何となく、お分かり頂けましたか?
PowerShell の配列で使える型
PowerShell で扱う配列では、
- String(文字列)
- int(32ビット整数)
- long(64ビット整数)
- bool(プール値)
- .Net Framework オブジェクト型
などの型をサポートしています。つまり、様々な型のデータを配列に格納することができます。
配列の作成と参照
配列を作成して初期化する方法自体は至って簡単です。変数に複数の値を割り当てるだけで、自動的に配列が初期値で作成されます。
まずは、配列を宣言してみる
配列を作成し値を格納するには、格納するデータを ” @ () (アット+かっこ)”で宣言し、” , (コンマ)”で区切る必要があります。(かっこ内を空白にすると空の配列ができる)
PowerShell で単純に配列を宣言すると、固定長(つまり大きさの決まった配列)を作成します。
PS C:\> # 配列の宣言=> $変数 = @(要素1,要素2,要素3,要素4) PS C:\> PS C:\> $array1 = @("a","b","c","d") PS C:\> PS C:\> # 空の配列宣言 PS C:\> $array2 = @()
また、
範囲演算子と呼ばれる ” .. (ピリオド2個)” を使用すると、連続するデータの配列を簡単に作成することができます。ただし、範囲演算子は下の実行結果を見るとわかるように “System.Int32 型” 、つまり整数型しか扱えないことに注意です。
(少数を指定した場合は、四捨五入で整数に変換されます。)
PS C:\># 範囲演算子=> $変数 = @(要素1..要素2) PS C:\> PS C:\> $array3 = @(1..5) PS C:\> PS C:\> $array4 = @("a".."d") 値 "a" を型 "System.Int32" に変換できません。エラー: "入力文字列の形式が正しくありません。" 発生場所 行:1 文字:1 + $array4 = @("a".."d") + ~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : InvalidArgument: (:) []、RuntimeException + FullyQualifiedErrorId : InvalidCastFromStringToInteger
配列には、この “@” を必ずつけることがコツです。ですが、この ”@”…. 実は省略しても問題ないのです。
PS C:\># @を省略してもエラーは起きない PS C:\> PS C:\> $array5 = "a","b","c","d" PS C:\> PS C:\> $array6 = (1..5)
このように、”@” で宣言していなくても配列はできてしまいます。これを読んで、あなたは
“宣言なしに無しに使えた方が楽で便利じゃないか!”
と、思われるかもしれません。確かに楽ですし、正直省略して問題はありません。しかし、
- この変数が配列になることを理解して使っているとアピールできる!
- 他の人がコードを読んだとき、「配列を宣言してるんだな!」と一目でわかる!
- コードの見た目に PowerShell らしさを出す!
このことを意識することは非常に大事なんですよ!通(ツウ)っぽさを出すことは、初心者として大事なことですからね。また、PowerShell の特徴として「動的な型付け」、つまりデータが”数字”や”文字”や”日付”といったどのタイプのものなのか自動で判断する機能があります。
配列も同様、特に意識していなければ自動的に型が割り振られます。もし、特定の型を指定した配列を作成したい場合は、
” [ ] (角カッコ) ” で囲んだ配列の型(String[]、long[]、int32[])
を、変数に指定します。
PS C:\># [型名[]]$変数 = @(要素1,要素2,要素3) PS C:\> PS C:\> [int32[]]$array7 = @(1,2,3,4) PS C:\> PS C:\> [string[]]$array8 = @("A","B","C")
作成した配列を参照してみる
ここまでで、配列デビューの第1歩”@を使った配列の宣言”はマスターできましたか?次は、作成した配列を参照してみましょう。配列の参照は、大きく2つあります。
- 配列の中身をすべて参照する
- 配列の要素を指定して参照する
ますは1つ目の、”配列の中身をすべて参照する”方法です。この方法は特に難しくなく、変数と同様に配列を格納した変数を入力するだけです。
PS C:\># $array1 = @("a","b","c","d")-文字列を格納 PS C:\> $array1 a b c d PS C:\># $array2 = @()-空の配列 PS C:\> $array2 PS C:\> PS C:\># $array3 = @(1..5)-範囲演算子で格納 PS C:\> $array3 1 2 3 4 5 PS C:\># $array4 = @("1.1".."1.5")-四捨五入で整数変換 PS C:\> $array4 1 2 PS C:\># $array5 = "a","b","c","d"-@を使わない宣言 PS C:\> $array5 a b c d PS C:\># $array6 = (1..5)-@を使わない宣言Part2 PS C:\> $array6 1 2 3 4 5 PS C:\> # [int32[]]$array7 = @(1,2,3,4)-明示的な整数型の宣言 PS C:\> $array7 1 2 3 4 PS C:\># [string[]]$array8 = @("A","B","C")-明示的な文字列型宣言 PS C:\> $array8 A B C
次に2つ目の”配列の要素を指定して参照する”方法です。要素を指定する方法は添字((ンデックス)を”[] (角カッコ)“で囲むことで指定します。要素を指定する際の注意点として、
配列の要素は、”0(ゼロ)” 番目から始まる
という性質があります。インデックス番号で要素を指定する場合は ”0” から指定することに注意してください。
PS C:\> # $array1 = @("a","b","c","d") PS C:\> $array1[0] a PS C:\> $array1[2] c
また、インデックス番号に “-1” を指定すると配列の最後の要素を参照することができます。
PS C:\> # $array1 = @("a","b","c","d") PS C:\> $array1[-1] d
参照時も”範囲演算子“を用いることが可能です。範囲指定時に”+ (プラス)”演算子を用いることで複数の範囲にわたって参照することも可能です。
PS C:\># 0~5の数字を格納 PS C:\> $array9 = @(0..5) PS C:\> PS C:\># 0~2番目を参照 PS C:\> $array9[0..2] 0 1 2 PS C:\># 0~2番目と4番目を参照 PS C:\> $array9[0..2+4] 0 1 2 4 PS C:\># 0~2番目と3~5番目を参照 PS C:\> $array9[0..2+2..4] 0 1 2 2 3 4 4PS C:\># 0~2番目と最後の要素を参照 PS C:\> $array9[0..2+-1] 0 1 2 5
これで、基本的な配列の宣言方法と参照方法が理解できましたね!
第2回では、少し特殊な”連想配列(ハッシュテーブル)”について解説します。
次回も是非ご覧ください!お楽しみに!
チェシャ男おススメ!PowerShell 入門者の必携本 (-皿-)
本記事をお読みくださったあなたに、チェシャ男が実際にPowerShell の勉強に使っているイチ押しの書籍を紹介します!
こちらの書籍ではリファレンス情報だけではなく、PowerShell の基礎知識や基本文法など約700ページにわたって解説しています!
初心者の場合、ネットでふらふらと情報を漁るよりは効率よく勉強ができると思いますよ!
本サイトでのPowershell 学習のお供に是非ご活用ください(*´皿`*)
疑問点等ございましたらお気軽にコメントください!
IT経験が浅いパワーシェル初心者です。
配列がよく分からずこのサイトに辿り着きました。
もし宜しければ、一点ご教授頂けると幸いです。
一例として
C:¥tmpに以下のファイルがあるとする
a.txt
b.txt
c.txt
変数にします。
$HENSU = (Get-ChildItem -Name -Path C:¥tmp)
変数を表示します。
$HENSU
a.txt
b.txt
c.txt
a.txtが要素1
b.txtが要素2
c.txtが要素3
上のように配列したいのですが、
a.txtもb.txtもc.txtも一緒の一つの要素として認識されてしまいます。
なぜ配列できないのか。ご教授頂けないでしょうか。
三太郎さん
コメントありがとうございます。
$HENSU = (Get-ChildItem -Name -Path C:¥tmp)
この時の$HENSUには配列型のデータが入っているかと思います。
$HENSU.GetType()
IsPublic IsSerial Name BaseType
-------- -------- ---- --------
True True Object[] System.Array
$HENSU[0]や$HENSU[2]のようにアクセスすると各要素のデータが取れませんでしょうか。