はじめに
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
」かつ「ファイル名先頭が数字ではない」ファイルが、バックアップされています。