cheshire-boy

オブジェクト

【ForEach-Object】PowerShellでパイプからforeachループするテクニック

投稿日:2016年11月8日 更新日:

こんにちは。チェシャ男です。(-皿-)

今回は、

【PowerShellで実行結果をパイプしてループ処理する方法】

について紹介します。

PowerShellでは基本的にオブジェクトとしてデータを扱う特徴があるので、配列の時と同じように他のコマンドレットの実行結果もループ処理することができます。

ForEach-Objectによる基本的なループ処理の方法については、こちら↓の記事をご参考ください。

【ForEach-Object】PowerShellで配列の要素をループ処理させる方法

スポンサーリンク

他コマンドレットの結果をループする

ループ処理を行うコマンドレット

ForEach-Object

の使い方は以下をご覧ください。(→詳細はこちら)

【コマンドレット】

ForEach-Object

【オプション】

パターン1
[v2 まで]
-Begin      <初期化スクリプトブロック{}>
-End       <終了スクリプトブロック{}>
-InputObject   <入力オブジェクト>
-Process     <適用スクリプトブロック{}>

[v3,v4,v5 以降]
-Begin      <初期化スクリプトブロック{}>
-End       <終了スクリプトブロック{}>
-InputObject   <入力オブジェクト>
-Process     <適用スクリプトブロック{}>
-RemainingScripts <残りのスクリプトブロック{}>
-Confirm
-WhatIf

パターン2
-MemberName  <メンバー名>
-ArgumentList   <引数リスト>
-InputObject   <入力オブジェクト>
-Confirm
-WhatIf

【入力】

System.Management.Automation.PSObject

【出力】

System.Management.Automation.PSObject

【エイリアス】

ForEach
%

出力結果に対して操作を加える

今回はGet-ChildItemコマンドレットの出力結果に対してループ処理します。”-Name”オプションを使用して名前だけを抽出してみましょう。

実行結果のように「C:\work」の配下に"File*.txt"というファイルを5つ用意してみました。

出力結果にはファイル名しかないので「フォルダパス(ロケーション) + ファイル名」という操作を行いフルパスに変更してみましょう。

このように他コマンドレットの実行結果に対し”ForEach-Object”コマンドレットを使用することでループ処理を行うことができます。

配列の操作時と比べるとほとんど違いはないので、そこまで難しくはないかと思います。

また、コマンドレットの実行結果オブジェクトには多くのメソッドやプロパティが用意されています。これらを使った方法はこちら↓の記事をご参考ください。

【ForEach-Object】PowerShellはループ中にメソッドやプロパティが使える?

(ちょっと応用編)初期化処理と終了処理を組み合わせる

他コマンドレットの実行結果をループ処理させる方法も特に難しくなかったと思うので少し応用してみましょう。

先ほどのループ処理でフルパスに変更した結果を配列に格納してみます。初期化処理で配列を宣言し終了処理で画面出力します。

初期化処理(-Begin):配列の宣言

メイン処理(-Process):フルパスに変更 + 配列に代入

終了処理(-End):画面出力

という感じです。

”-Begin”オプションスクリプトブロック内で配列を宣言し、"-End"オプション内で配列を画面表示しています。

また、親ディレクトリ「C:\work\」がべた書きなので初期化処理にまとめてみましょう。$pathという変数を用意して格納します。

このように工夫次第ではもっと色々できそうですね。

あなたが「だいぶPowerShellに慣れてきたな~」と思ったら色んな処理を試してみてください!

まとめ

他コマンドレットの実行結果に対してループ処理をしたいときは配列と同様に、

<コマンドレット> | ForEach-object -Process {<処理内容>}

を使用する。

 

スポンサーリンク

スポンサーリンク

-オブジェクト
-, , , ,

Copyright© 【チェシャわら】PowerShellとは、から学ぶ入門者の教科書-脱コマンドプロンプト- , 2017 AllRights Reserved Powered by micata2.