はじめに
PowerShellでファイルをコピーする際、バックアップを兼ねてファイル名に日付を付ける、というケースがあるとします。
その際に、自動で日付を付ける方法について考えます。
前提
| ツール | バージョン |
|---|---|
| PowerShell | 5.1.17134.48 |
| Visual Studio Code | 1.24.0 |
今回使うコマンドレットであれば、どのバージョンであっても動作すると思われます。
また、フォルダ構成は以下の通りです。
sourceフォルダのファイルを、backupフォルダに移すものとします。
やり方
日付を取得する
本日日付を取得します。
$date = Get-Date -Format "yyyyMMdd";
Get-Dateコマンドレットで、本日日付を取得できます。(DateTime型)
-Formatオプションを付与すると、指定した書式の文字列を取得できます。
書式指定に関してはこちら。
コピーする
Copy-Itemコマンドレットを使用します。
Copy-Itemは、単にファイルをコピーするだけでなく、ファイル名を変えてコピーする機能もあります。
-Destinationにファイル名まで指定するといいです。
ここでは、元のファイル(memo.txt)の先頭に、日付を付けます。
$date = Get-Date -Format "yyyyMMdd";
$dest = Join-Path .\backup ($date + "_memo.txt")
Copy-Item -Path ".\source\memo.txt" -Destination $dest -Force
複数ファイルに対応する
基本的には、ループ内で繰り返しコピーすることとなります。
フォルダ内のファイルを取得する
Get-ChildItemを使用します。
$files = Get-ChildItem -Path .\source -File;
今回はファイルのみで良いため、-Fileを付けています。
また、これで返されるオブジェクトはファイルの情報を持っています。
コピーする
先ほどは、memo.txtのように、ファイル名を文字列で直接書いていました。
今回は、フォルダ内の項目をすべて使用するので、ループで取得します。
foreach ($file in $files) {
$dest = Join-Path .\backup ($date + "_" + $file.Name)
Copy-Item -Path $file.FullName -Destination $dest -Force
}
ファイル情報から、Nameでファイル名、FullNameで絶対パスを取得し、使用しています。
コピーするファイルの条件を指定する
Get-ChildItemでは、項目を取得する際の条件を指定できます。
詳細はこちらを見ていただくとして、一部紹介します。
拡張子を指定
$files = Get-ChildItem -Path .\source\*.txt -File;
-Pathで、上のようにワイルドカードを使用します。
特定の文字から始まるファイルを除く
例えば、「ファイル名が数字から始まるファイルを除外する」場合、
$files = Get-ChildItem -Path .\source\* -File -Include *.txt -Exclude [0-9]*;
のように、-Includeおよび-Excludeオプションを使って、柔軟に対処することもできます。
全文
$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」かつ「ファイル名先頭が数字ではない」ファイルが、バックアップされています。


