SEくぼたの事件簿

インフラSEとしての活動を記録していきます

Powershellでの繰り返し処理(for)の使い方

こんにちは!

今月も早々にブログに着手できました。やったぜ!笑

何を書こうかネタ探しをしていたのですが、僕のブログの閲覧いただいた履歴をみるとこの数カ月で以下のブログを閲覧いただいている割合が大きく上がっていました。

kbtblog.hatenablog.com

上記ブログの内容はPowershellでForeachを利用してループ処理を行う方法についてでした。

これを閲覧いただいているってことは。。。みんなループしたいんだな!!笑

と謎の納得をしたため、今回は

Powershellでの繰り返し処理(for)の使い方

について記載していきたいと思います。

 

  • forとforeachの違い

上記リンクに記載していた通り、foreachを利用するとデータの行数分処理を繰り返してくれていました。

forを利用する代表ケースとしては、開始条件終了条件を指定したい場合です。

今回は一例として以下のCSVファイルに対して処理をしたいと思います。

下記のデータを「Looptest.csv」という名前でC:\tempに保存しています。

f:id:KKubo19:20210311183804p:plain

上記にて例えばD列(所属)が営業じゃなくなるまで繰り返し処理をしてみたいと思います。

※この内容は一例として実施しているので本当にfor利用する際はA列(No)が3から8まで処理みたいに利用するケースが多いと思います。今回は終了条件に文字列も利用できることを表現するために良くない例になってしまっています。ごめんなさい

 

今回は2行目から6行目のE列(Flag)に1を入力するように繰り返し処理をしたいと思います。

f:id:KKubo19:20210311184334p:plain

  • forの基本構文

forの利用方法は

for(開始条件※初期値;終了条件;更新条件){繰り返す処理}

というように記載します。

利用の前に上記csvをimport-csvというコマンドレットにてメモリにロードするとどのようにみえるか確認します。

$Datas = Import-Csv -Path "C:\temp\Looptest.csv" -Encoding Default

$Datasという変数に格納します。

Datasの中にどのように入っているかというと

f:id:KKubo19:20210311190324p:plain

こんな感じです。

CSVExcelでみているときとほぼ一緒ですね!

$Datasは配列として利用されており、例えば1行目だけ表示したい場合は

$Datas[0]

と記載すると1行目のみ表示可能です。

f:id:KKubo19:20210311190406p:plain

※配列は0番目から始まるので1行目の表示の際には内の数字が0となる点を注意してください。

 

それではまずは開始条件(初期値)です。

今回1行目から所属が営業ではなくなるまで繰り返しFlagに1を入力するようにします。

そのため、開始条件は配列の0番目から

ということになるため、$i = 0としておきます。※変数名はなんでもOKです。

次に終了条件は所属が営業だったら処理

としますので、$Datas[$i]."所属" -eq "営業"となります。

-eqは=を示しています。

Powershellでは比較演算子は以下のリンクのようになっています。

※比較演算子って比較する時の表記って意味ね

f:id:KKubo19:20210311194742p:plain

about_Comparison_Operators - PowerShell | Microsoft Docs

 

最後に更新条件です。

配列を1行目から2行名3行目と1行ずつ次の行へ遷移していきたいので、

$i++とします。

$i++は繰り返しを行うごとに$iに1を加算するという意味になります。

なので、1回目の処理では$iは0、2回目の処理の時は$iは1になります。

補足

 $Datas[$i]とすると$iに入っている数字が代入されているため、初回は$Datas[0]を表現することとなります。$i++という更新条件をつけているため、繰り返しの2回目は$Datas[1]というように変化していきます。

また、$Datas[0]."所属"とすると下記の赤枠を表示する指定となります。

f:id:KKubo19:20210311191615p:plain

同様に$Datas[1]."所属"とすると

f:id:KKubo19:20210311191708p:plain

となります。

このように$Datasの変数にをつけて[]内も変数とする。

変数をfor分を利用して数字を1ずつ加算しながら$Datasの表示行も変数で指定し繰り返し処理を行っていきます。

f:id:KKubo19:20210311192013p:plain

 

Flagに値を代入する際は

$Datas[0].Flag = 1

とすることでFlag列の1行目に1を入力可能です。

そのため、今回は

$Datas[$i].Flag = 1

となります。

上記で色々な説明をしてきましたが、最終的なスクリプトはこんな感じです。

$Datas = Import-Csv -Path "C:\temp\Looptest.csv" -Encoding Default

for ($i = 0; $Datas[$i]."所属" -eq "営業"; $i++) {
    $Datas[$i].Flag = 1
}

f:id:KKubo19:20210311192658p:plain

これを実行してから$Datas内をみると

f:id:KKubo19:20210311192744p:plain

こんな感じで1行目から順番に所属が営業の場合、Flagに1がはいりました。

あとは$Datasをファイルとして出力することで、csv自体を更新(上書き)することも可能です。

そこまでやりたいよって人は

スクリプトの6行目に以下を追記してください。

$Datas | Export-Csv -Path "C:\temp\Looptest.csv" -Encoding Default -NoTypeInformation

 

  • まとめ(補足) 

9行目のFlagに値が入らないのは1行目から順番に所属が営業だったら処理とするため、

6行目にて繰り返し処理が終了してしまい、9行目にたどり着かないのです。

※だから上記で記載したとおり例が悪い!笑 となるわけですね・・・・

こういうケースでも9行目にも入力する方法としてWhere-Objectみたいなものがあったりします!

次回はそれを書こうかな♪

for文やforeach文について記載してみましたが、みなさんはどちらを利用するケースが多いでしょうか?

両方とも便利なので使ったことないって方はぜひ使ってみてくださいね!

 

  • 最後に!

Twitterでも情報発信したいと思いますので、興味があったらフォローしてください!