Posted at

ファイル名に日付を付けてファイルをコピーする

More than 1 year has passed since last update.


はじめに

PowerShellでファイルをコピーする際、バックアップを兼ねてファイル名に日付を付ける、というケースがあるとします。

その際に、自動で日付を付ける方法について考えます。


前提

ツール
バージョン

PowerShell
5.1.17134.48

Visual Studio Code
1.24.0

今回使うコマンドレットであれば、どのバージョンであっても動作すると思われます。

また、フォルダ構成は以下の通りです。

sourceフォルダのファイルを、backupフォルダに移すものとします。


やり方


日付を取得する

本日日付を取得します。


backup.ps1

$date = Get-Date -Format "yyyyMMdd";


Get-Dateコマンドレットで、本日日付を取得できます。(DateTime型)

-Formatオプションを付与すると、指定した書式の文字列を取得できます。

書式指定に関してはこちら


コピーする

Copy-Itemコマンドレットを使用します。

Copy-Itemは、単にファイルをコピーするだけでなく、ファイル名を変えてコピーする機能もあります。

-Destinationにファイル名まで指定するといいです。

ここでは、元のファイル(memo.txt)の先頭に、日付を付けます。


backup.ps1

$date = Get-Date -Format "yyyyMMdd";

$dest = Join-Path .\backup ($date + "_memo.txt")
Copy-Item -Path ".\source\memo.txt" -Destination $dest -Force



複数ファイルに対応する

基本的には、ループ内で繰り返しコピーすることとなります。


フォルダ内のファイルを取得する

Get-ChildItemを使用します。


backup.ps1

$files = Get-ChildItem -Path .\source -File;


今回はファイルのみで良いため、-Fileを付けています。

また、これで返されるオブジェクトはファイルの情報を持っています。


コピーする

先ほどは、memo.txtのように、ファイル名を文字列で直接書いていました。

今回は、フォルダ内の項目をすべて使用するので、ループで取得します。


backup.ps1

foreach ($file in $files) {

$dest = Join-Path .\backup ($date + "_" + $file.Name)
Copy-Item -Path $file.FullName -Destination $dest -Force
}

ファイル情報から、Nameでファイル名、FullNameで絶対パスを取得し、使用しています。


コピーするファイルの条件を指定する

Get-ChildItemでは、項目を取得する際の条件を指定できます。

詳細はこちらを見ていただくとして、一部紹介します。


拡張子を指定


backup.ps1

$files = Get-ChildItem -Path .\source\*.txt -File;


-Pathで、上のようにワイルドカードを使用します。


特定の文字から始まるファイルを除く

例えば、「ファイル名が数字から始まるファイルを除外する」場合、


backup.ps1

$files = Get-ChildItem -Path .\source\* -File -Include *.txt -Exclude [0-9]*;


のように、-Includeおよび-Excludeオプションを使って、柔軟に対処することもできます。


全文


backup.ps1

$date = Get-Date -Format "yyyyMMdd";

$files = Get-ChildItem -Path .\source\* -File -Include *.txt -Exclude [0-9]*;

foreach ($file in $files) {
$dest = Join-Path .\backup ($date + "_" + $file.Name)
Copy-Item -Path $file.FullName -Destination $dest -Force
}



結果


コピー元


バックアップ

スクリプトで指定したように、「拡張子が.txt」かつ「ファイル名先頭が数字ではない」ファイルが、バックアップされています。