Windowsのポチポチ業務を爆速化するPowerShell、パイプラインを使いコマンドレット間で値を引き渡す方法


Windowsのポチポチ業務(マウスを使った業務)を爆速化するために、PowerShellを使った効率化の方法をお伝えしています。

前回の記事はこちらです。

Windowsのポチポチ業務を爆速化するPowerShell、ForEach-Objectで配列の全要素を処理する方法
Windowsのマウスを使った業務(=ポチポチ業務)を爆速化するPowerShell。ForEach-Objectというコマンドレットを使って、配列の全要素への繰り返し処理をシンプルに書く方法をお伝えします!

前回はコマンドレット:ForEach-Objectを使って、配列の全要素に対する繰り返し処理をシンプルに書く方法をお伝えしました。

今回から繰り返し処理をすることで複数ファイルの名称を変更する実践的な方法をご紹介します。

本記事ではコマンドレット間でファイルを引き渡すためのパイプラインという仕組みを詳しく説明いたします。

それではいってみましょう!

スポンサーリンク

ファイル名を変更するスクリプトの全体像

PowerShellのスクリプトはコマンドレットをパズルのように組み合わせていきます。

ファイル名を変更するスクリプトの手順は以下の通りです。

  1. Get-ChildItemで複数ファイルを取得する
  2. ForEach-Objectに複数ファイルを引き渡す
  3. Copy-Itemでファイルをコピーしファイル名を変更する

コマンドレットを組み合わせるだけなので全体像としては単純ですね。

手順1.のGet-ChidItemから順番に説明していきます。

Get-ChildItemでファイルを取得する

今回はデスクトップの「input」というディレクトリに01.txt~20.txtと20個のテキストファイルを用意しました。

Get-ChildItemで変更元の複数ファイルをすべて取得することができます。構文は以下の通りです。

Get-ChildItem -Path ファイル名

-Pathには取得したいファイル名を指定するのですが、今回は「*.txt」を指定します。

*」はワイルドカードという記号です。ワイルドカードを使えば任意の文字列を指定することができます。「*」の後ろに「.txt」をつけていますので、末尾が「.txt」であればファイルを取得するという意味になります。

これで複数のファイルを取得することができます。

ForEach-Objectに複数ファイルを引き渡す

スクリプトの手順2をもう一度見てください。

2. ForEach-Objectに複数ファイルを引き渡す

Get-ChidItemで取得した複数のファイルを、どのようにForEach-Objectに引き渡せばよいのでしょうか。

その時に使うのがパイプラインです。

今回Get-ChildItemでは「*.txt」とファイル名を限定しているため「ファイルを取得する」と表現してきましたが、ディレクトリを取得することもできます。ファイル、ディレクトリなどをオブジェクトといいます

パイプラインとはコマンドレットで取得したオブジェクトを別のコマンドレットに引き渡す仕組みです。

オブジェクトとは

PowerShellのオブジェクトとは、Windowsの仕組み(フォルダ・ファイル・エクスプローラーなど)を仮想的に扱えるようにした仕組みです。

Windowsのシステムで扱われるものはすべてオブジェクトとして定義されています。

オブジェクトはプロパティとメソッドで構成されます

「ファイル」を例に説明すると

  • プロパティ:ファイル名、作成日、最終更新日、格納されているディレクトリ等
  • メソッド:開く、閉じる、コピーする等

プロパティは名前など属性、メソッドは開く/閉じるなど動作(ふるまい)のことです。仮想的に用意されたプロパティやメソッドを使うことで、Windowsの機能にアクセスすることができます。

パイプラインを使ってオブジェクトを引き渡す

パイプラインの使い方を見ていきましょう。

パイプラインでオブジェクトを引き渡すことができたか確認するため、後続では文字列をコンソールに表示するWrite-Hostを使います。

Get-ChildItem | ForEach-Object{ Write-Host $_.name }

「|」はパイプと呼びます。パイプを書くことでGet-ChildItemで取得した複数のオブジェクトは配列として後続のコマンドレットに引き渡されます

「$」は自動変数といい、オブジェクトが一つずつ順番に自動的に格納されます。「$.name」と自動変数の後ろで「.プロパティ名」と書くことでプロパティを取り出すことができます。

ForEach-Objectはパイプラインで引き渡された複数のオブジェクトに対して、{}に書かれた処理を順番に実施してくれます。

スクリプトを実行する

ISEで以下のスクリプトを実行してみます。デスクトップのパスはご自身の環境のものに書き換えてくださいね。

Set-Location C:\Users\terad\Desktop\input
Get-ChildItem -Path *.txt | ForEach-Object{write-host $_.name}

このようにinputディレクトリ内のすべてのオブジェクト01.txt~20.txtの名前を、Write-Hostでコンソールに書き出すことができました。

まとめ

いかがだったでしょうか。コマンドレットが取得したオブジェクトはパイプラインで別のコマンドレットへ配列として引き渡すことができます。また、引き渡したオブジェクトは自動変数「$_」に自動的に格納されます。後続のコマンドレットでは「$_」や「$_.プロパティ名」に対して処理を記載します。

ForEach-Objectを使えば複数のオブジェクトに対して{}の処理を順番に実施することができます。

難しいループ文など書かなくてよいコマンドレット:ForEach-Objectが用意されているので楽に繰り返し処理が実現できますね。

次回はCopy-Itemでファイルの名称を変更する方法を説明してきますよ。

最後までお読みいただきありがとうございました!

連載目次:Windowsのポチポチ業務を爆速化するPowerShell

Windowsのポチポチ業務(マウスを使った業務)を爆速化するために、PowerShellを使った効率化の方法をお伝えしています。
  1. Windowsのポチポチ業務を爆速化するPowerShell、はじめのハードルぐーーんと下げてみます!
  2. Windowsのポチポチ業務を爆速化するPowerShell、キーボードを使わずササっと起動する方法
  3. Windowsのポチポチ操作を爆速化するPowerShellの絶対条件!ディレクトリとその移動をマスターしよう!
  4. Windowsのポチポチ業務を爆速化するPowerShell、コマンドレットを腹の底から理解する!
  5. Windowsのポチポチ業務を爆速化するPowerShell、オンラインヘルプでコマンドレットを使い倒す!
  6. Windowsのポチポチ業務を爆速化するPowerShell、統合開発環境ISEを紹介します!
  7. Windowsのポチポチ業務を爆速化するPowerShell、スクリプトを実行するための準備
  8. Windowsのポチポチ業務を爆速化するPowerShell、フォルダを作るスクリプトの作り方
  9. Windowsのポチポチ業務を爆速化するPowerShell、if文を使いフォルダの有無で処理を分岐させる方法
  10. Windowsのポチポチ業務を爆速化するPowerShell、ForEach-Objectで配列の全要素を処理する方法
  11. Windowsのポチポチ業務を爆速化するPowerShell、パイプラインを使いコマンドレット間で値を引き渡す方法
  12. Windowsのポチポチ業務を爆速化するPowerShell、ファイルを別フォルダにコピーし名称を変更する方法
  13. Windowsのポチポチ業務を爆速化するPowerShell、ファイル名を変更する方法
  14. Windowsのポチポチ業務を爆速化するPowerShell、正規表現で複雑なファイル名変更をする方法
  15. Windowsのポチポチ業務を爆速化するPowerShell、タスクスケジューラでスクリプトを決まった日時に起動する方法
  16. Windowsのポチポチ業務を爆速化するPowerShell、ファイルをバックアップするスクリプトの作り方
  17. Windowsのポチポチ業務を爆速化するPowerShell、関数を作ってスクリプトから呼び出す方法
  18. Windowsのポチポチ業務を爆速化するPowerShell、関数をコンソールで登録して呼び出す方法
  19. Windowsのポチポチ業務を爆速化するPowerShell、短いワードでサッと関数を呼び出すエイリアスの使い方
  20. Windowsのポチポチ業務を爆速化するPowerShell、関数やエイリアス保存場所のドライブを紹介します
  21. Windowsのポチポチ業務を爆速化するPowerShell、elseifで日付の元号を判定する方法
  22. Windowsのポチポチ業務を爆速化するPowerShell、日付を操るDatetime型

タイトルとURLをコピーしました