雪ん子パースペクティヴ

読むとちょっとタメになるエントリー。

【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コマンドのみで条件を付けて実行するのもスマートですが、今回のように要所で条件をつけ、コピーするのも楽かと思います。

 

 

以上。