みなさんこんにちは、テラド(@terashin1226)です!
Windowsのポチポチ業務(マウスを使った業務)を爆速化するために、PowerShellを使った効率化の方法をお伝えしています。
前回から複数ファイルを別ディレクトリにコピーし、名称を変更するスクリプトを作成しています。
コマンドレット間でオブジェクトを引き渡すためのパイプランという仕組みを前回記事で詳しく解説しました。
今回はPowerShellでファイルを別ディレクトリにコピーし名称を変更する方法をお伝えしながら実用的なスクリプトを完成させます!
それではいってみましょう!
スクリプトの全体像
スクリプトのおおまかな全体像は以下のようになります。
- Get-ChildItemで複数ファイルを取得する ←前回説明
- ForEach-Objectに複数ファイルを引き渡す ←前回説明
- Copy-Itemでファイルをコピーしファイル名を変更する ←今回説明するところ
今回はForEach-Objectに引き渡されたファイルをコマンドレット:Copy-Itemでファイル名を変更し別ディレクトリへコピーする方法をお伝えし、スクリプトを完成させます。
事前準備
さっそくファイルをコピー!…と行きたいところなのですが、その前にディレクトリのフルパスを変数に代入してスクリプトを見やすくしたり、コピー先のディレクトリを作成します。
ディレクトリのフルパスを変数に代入する
ディレクトリのフルパスを変数に代入してスクリプトを見やすくします。
コピー元のディレクトリを「$indir」、コピー先のディレクトリ「$outdir」とし、どちらのディレクトリもデスクトップに配置することにします。
$indir = 'C:\Users\terad\Desktop\input' $outdir = 'C:\Users\terad\Desktop\output'
このようにフルパスを変数に代入しておくことで、長いパスを毎回記載しなくともよくなります。
コピー先のディレクトリがなければ作成する
コピー先のディレクトリが存在しない場合には自動で作成し、人間が作業する手間を省きます。
if (-not (Test-Path $outdir)){ New-Item $outdir -ItemType Directory }
if文でディレクトリの有無を判定する方法は以下の記事を参照してくださいね。
ファイルをコピーし名称を変更する
コマンドレット:Copy-Itemを使ってファイルをコピーします。
Copy-Itemの構文
Copy-Itemの構文を把握しておきましょう。
Copy-Itemの直後にコピー元のファイル名、Destinationパラメータにコピー先のファイル名を指定します。「C:\Users\terad\Desktop\input\01.txt」のようにファイル名はフルパスで指定します。
Copy-ItemはDestinationパラメータで指定したファイル名に変更した上でファイルをコピーします。
Copy-Itemで複数ファイルを別ディレクトリにコピーしファイル名を変更する
Copy-Itemで別ディレクトリにコピーしファイル名を変更するスクリプトは以下のようになります。
Get-ChildItem -Path $indir/*.txt | ForEach-Object{ $infile = $indir +'\' + $_.name $outfile = $outdir + '\変更後' + $_.name Copy-Item $infile -Destination $outfile }
詳しく説明していきます。
1行目:Get-ChildItemのPathパラメータでパスを「$indir¥*.txt」と指定します。パスをワイルドカード「*」を含む形で書くことで、コピー元ディレクトリ内の拡張子「.txt」であるファイルをすべて取得します。取得したファイルをパイプラインでForEach-Objectに引き渡します。
3、4行目:新たに変数$infileと$outfileを用意しました。
PowerShellでは「+」を使用することで文字列を結合できます。
$infileに①コピー元のフルパス「$indir」と②nameプロパティで取得したファイル名を結合し代入します。$outfileに①コピー先のフルパス「$outdir」と②nameプロパティで取得したファイル名に③「変更後」という文字列をプラスして代入します。
5行目:用意した$infileと$outfileを使いCopy-Itemで新たなファイルを作成します。
3~5行目はすべてForEach-Object内での処理なので、複数ファイルすべてについて適用されます。
完成したスクリプトを実行する
ここまで作ってきたスクリプトをつなげると以下のようになります。事前準備として変数にディレクトリのフルパスを代入していることで、それ以降のスクリプトがシンプルで見やすくなっていますね。
$indir = 'C:\Users\terad\Desktop\input' $outdir = 'C:\Users\terad\Desktop\output' if (-not (Test-Path $outdir)){ New-Item $outdir -ItemType Directory } Get-ChildItem -Path $indir\*.txt | ForEach-Object{ $infile = $indir +'\' + $_.name $outfile = $outdir + '\変更後' + $_.name Copy-Item $infile -Destination $outfile }
デスクトップの「input」ディレクトリに01.txt~20.txtと20個のテキストファイルを格納しています。
スクリプトをISEのスクリプトウィンドウに入力して実行すると…
新たにoutputディレクトリが作成、ファイルがコピーされました。ファイル名に「変更後」が加わり、名称変更も成功していますね!
まとめ
Copy-Itemを使えばファイルをコピーし名前を変更することができます。さらにフルパスを変数に代入することでスッキリとしたスクリプトを書くことができました。今回作ったスクリプトをカスタマイズし現場でもお役立てください。
でも…ファイル名をもっと自由に変更したいですよね。そのため次回は正規表現という方法についてお伝えしていきます。
最後までお読みいただきありがとうございました!
連載目次:Windowsのポチポチ業務を爆速化するPowerShell
Windowsのポチポチ業務(マウスを使った業務)を爆速化するために、PowerShellを使った効率化の方法をお伝えしています。- Windowsのポチポチ業務を爆速化するPowerShell、はじめのハードルぐーーんと下げてみます!
- Windowsのポチポチ業務を爆速化するPowerShell、キーボードを使わずササっと起動する方法
- Windowsのポチポチ操作を爆速化するPowerShellの絶対条件!ディレクトリとその移動をマスターしよう!
- Windowsのポチポチ業務を爆速化するPowerShell、コマンドレットを腹の底から理解する!
- Windowsのポチポチ業務を爆速化するPowerShell、オンラインヘルプでコマンドレットを使い倒す!
- Windowsのポチポチ業務を爆速化するPowerShell、統合開発環境ISEを紹介します!
- Windowsのポチポチ業務を爆速化するPowerShell、スクリプトを実行するための準備
- Windowsのポチポチ業務を爆速化するPowerShell、フォルダを作るスクリプトの作り方
- Windowsのポチポチ業務を爆速化するPowerShell、if文を使いフォルダの有無で処理を分岐させる方法
- Windowsのポチポチ業務を爆速化するPowerShell、ForEach-Objectで配列の全要素を処理する方法
- Windowsのポチポチ業務を爆速化するPowerShell、パイプラインを使いコマンドレット間で値を引き渡す方法
- Windowsのポチポチ業務を爆速化するPowerShell、ファイルを別フォルダにコピーし名称を変更する方法
- Windowsのポチポチ業務を爆速化するPowerShell、ファイル名を変更する方法
- Windowsのポチポチ業務を爆速化するPowerShell、正規表現で複雑なファイル名変更をする方法
- Windowsのポチポチ業務を爆速化するPowerShell、タスクスケジューラでスクリプトを決まった日時に起動する方法
- Windowsのポチポチ業務を爆速化するPowerShell、ファイルをバックアップするスクリプトの作り方
- Windowsのポチポチ業務を爆速化するPowerShell、関数を作ってスクリプトから呼び出す方法
- Windowsのポチポチ業務を爆速化するPowerShell、関数をコンソールで登録して呼び出す方法
- Windowsのポチポチ業務を爆速化するPowerShell、短いワードでサッと関数を呼び出すエイリアスの使い方
- Windowsのポチポチ業務を爆速化するPowerShell、関数やエイリアス保存場所のドライブを紹介します
- Windowsのポチポチ業務を爆速化するPowerShell、elseifで日付の元号を判定する方法
- Windowsのポチポチ業務を爆速化するPowerShell、日付を操るDatetime型