こんにちは!Windowsの運用保守や社内インフラの自動化で、PowerShellスクリプトを書いている皆さん、お疲れ様です。
日次バッチやバックアップのスクリプトを作っていると、以下のように「ファイル名の一部に今日の日付(例:6月9日なら 609)を自動で組み込んでコピーしたい」という場面がよくありますよね。
コピー元:C:\work\hoge_609.txt
わざわざ事前に $date = ... のように変数を作ってから使い回すのも悪くありませんが、「1回しか使わない日付だし、コマンドの中に直接埋め込んで1行でスッキリ終わらせたい!」と思ったことはありませんか?
今回は、バッチファイル(.bat)では真似できない、PowerShell単体で日付フォーマットコマンドを別のコマンドに直埋めする裏ワザをご紹介します。
1. 結論:埋め込みたいコマンドを $() で囲むだけ!
PowerShellには、文字列や他のコマンドの途中で別のコマンドを実行し、その結果をその場に展開できる $()(部分式 / Subexpression) という強力な機能があります。
今回の「フォーマット指定した日付のファイル(例:hoge_609.txt)を別フォルダにコピーする」という処理は、以下のようにわずか1行で書くことができます。
➔ 実際のコマンド例
Copy-Item C:\work\hoge_$([DateTime]::Today.ToString('Mdd')).txt C:\work\
💡 動作の解説
-
コマンドラインの中に
$(~)というお馴染みのドルマークとカッコのセットを配置します。 -
その内側に、日付をフォーマット出力するPowerShellのコマンド
[DateTime]::Today.ToString('Mdd')をそのまま記述します。 -
PowerShellがこの一行を評価するとき、まず
$()の中身を最優先で実行し、その結果(例:609)を変数のようにその場にドロップしてくれます。 -
最終的に
hoge_609.txtという文字列に綺麗に変換され、Copy-Itemが実行されます。
2. よく使う日付フォーマットのバリエーション
日付の形式(フォーマット)は、実務のルールに合わせて ToString() の中身を書き換えるだけで自由自在にコントロールできます。
よく使う鉄板のフォーマットをまとめました。
-
月日(先頭のゼロなし):
Mdd➔609(6月9日の場合) -
月日(常に2桁):
MMdd➔0609 -
西暦4桁+月日(定番):
yyyyMMdd➔20260609 -
ハイフン区切り:
yyyy-MM-dd➔2026-06-09
これらもすべて、先ほどの $() の中に組み込むだけでそのまま直埋めが可能です。
# 例:yyyyMMdd 形式でログファイルをバックアップフォルダへコピー
Copy-Item C:\logs\app.log C:\backup\app_$([DateTime]::Today.ToString('yyyyMMdd')).log
3. 注意点:文字列として埋め込むときは「ダブルクォーテーション」で!
今回はパスをそのまま(クォーテーションなしで)記述していますが、もしパスの途中にスペースが含まれているなどの理由で全体をクォーテーションで囲む場合は、必ず ダブルクォーテーション( " ) を使ってください。
-
⭕ 成功(中身が展開される):
"C:\Program Files\hoge_$([DateTime]::Today.ToString('Mdd')).txt" -
❌ 失敗(文字がそのまま扱われる):
'C:\Program Files\hoge_$([DateTime]::Today.ToString('Mdd')).txt'※シングルクォーテーション(')で囲むと、$()が機能せず、文字通り「$([DateTime]…)」という名前のファイルを探しに行ってエラーになってしまいます。
まとめ
PowerShellスクリプト内で動的に日付入りのファイル名を扱いたいときは、以下のルールを覚えておくとスクリプトが劇的にシンプルになります。
-
埋め込みたいコマンド全体をカッコで囲み、頭に
$をつけて$()にする -
今日の日付のフォーマット指定は
[DateTime]::Today.ToString('フォーマット')で取得できる -
文字列として囲むときはダブルクォーテーション(
")を使う
変数宣言の行を減らして、スマートで読みやすい1行スクリプトを書いてみてくださいね!
