【Powershell】親フォルダを含め、特定のファイルをコピーする。
更新するのは久しぶりだなー。
はろー、yukiです。
Windows系はその名の通り、ウインドウを駆使して操作するところに利点がありますが、大量な同一作業をするには不向きです。
そこで、それが一度で行えるコマンドが使いたいたくなります。
UNIX系のPCを使っていればコマンドが当然のように使えて便利です。
一方、世間ではWindows系のPCが普段使われていて、それに備わっているコマンドプロンプトの認知度は高くとも、使い勝手がさほど良くない。
そういう意味で、僕は認知度が高くなくても、使い勝手の良いPowershellが好きです。
今回は、ファイルのコピーという単純な作業を紹介したいと思います。
条件は3つ。
--------------------
1. コピーの対象が同一で、作業が繰り返し大量にあること
2. 特定のファイルのみをコピーすること
3. コピー対象の親フォルダを含めること
--------------------
コマンドだけ知りたい方は下記になります。
$dir = ls *
copy $dir -r -filter *.txt .\Destination\
それでは見ていきましょう。
$dir = ls *
上のコマンドは単純で、lsコマンドでファイルの一覧を取得し、その値を$dirに格納しています。
copy $dir -r -filter *.txt .\Destination\
こちらは、copyコマンドです。
$dirをコピーの対象としています。
-rは再帰的にコピーを行うオプションで、これによって親フォルダがコピーされます。
-filterはコピーの対象を限定するもので、「*.txt」とすることでtxtという拡張子のファイルのみを対象とします。
「.¥Destination¥」はコピーしたファイルの送り先です。
それでは、実行結果を見てみましょう。
PS C:\Users\anonymous\Desktop\Base> ls -r * …ls -rコマンドでコピー元を確認 ディレクトリ: C:\Users\anonymous\Desktop\Base\test Mode LastWriteTime Length Name ---- ------------- ------ ---- -a---- 2017/09/03 22:59 0 test.bmp -a---- 2017/09/03 22:52 4 test.txt PS C:\Users\anonymous\Desktop\Base> PS C:\Users\anonymous\Desktop\Base> $dir = ls * …コマンド結果を格納 ※-rオプションはつけないこと PS C:\Users\anonymous\Desktop\Base> PS C:\Users\anonymous\Desktop\Base> copy $dir -r -filter *.txt ..\Destination\ …コピーを実行 PS C:\Users\anonymous\Desktop\Base> ls -r ..\Destination\ …実行結果を確認 ディレクトリ: C:\Users\anonymous\Desktop\Destination Mode LastWriteTime Length Name ---- ------------- ------ ---- d----- 2017/09/03 23:00 test ディレクトリ: C:\Users\anonymous\Desktop\Destination\test Mode LastWriteTime Length Name ---- ------------- ------ ---- -a---- 2017/09/03 22:52 4 test.txt
txtファイルとその親フォルダが(ディレクトリ構造を変えないまま)コピーされたことが確認されました。
さて、こちらはおまけになりますが、$dirにコマンド結果を格納するのは次のようなことができるからです。
$dir = ls -filter test* |Where-Object { $_.LastWriteTime -gt "2017/09/01 11:30"}
詳細を見てみましょう。
$dir = ls -filter test*
こちらは、lsコマンドの段階で、先頭にtestという文字のあるフォルダを指定しています。
そしてさらに、Where-Objectコマンドで、更新日時を指定しています。
Where-Object { $_.LastWriteTime -gt "2017/09/01 11:30"}
上の場合、2017/9/1の11:30より、greater than(より大きい)値なので、11:30よりも後に更新されたものを対象としています。
さて、copyコマンドのみで条件を付けて実行するのもスマートですが、今回のように要所で条件をつけ、コピーするのも楽かと思います。
Powershellのクックブックはこちら。
以上。