0
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

New-TimeSpan コマンド

Last updated at Posted at 2018-11-26

運用あるある。
Xか月前のログファイルを削除する とかそういうのに使えそう。
とも思ったけど、いまのところ良い活用方法はとくに思いつないな。。。

##とりあえず、基本
New-TimeSpan -- docs.microsoft.com

ここに、素敵な使用例が書いてあったのです。
image.png

おー、これで簡単に、XX日後とかXX時間前とかできるんですね。
これならコマンドやスクリプトに詳しくない人が見ても、ソースを見てなんとなく何をやっているのか見当つけられそうで親切ですね。

##では試してみましょう
確認環境は Windows Server 2008 R2 の PowerShell Ver.2.0 です。
以下、2018/11/26 時点でのコマンド実行結果です。
image.png

まずは初心者らしく使用例に忠実に。
あっ ロケールのデフォルトのフォーマットですね。
分かりやすいけど使いにくいという(笑)
image.png

では、少しバリエーションを変えて練習です。6か月前とか出したいですね。
指定できるオプションで一番大きい時間の単位は、Days なので(Months とかあるといいのにね)、おおよそ6か月として -days 180 を指定します。(変数名は 6 Months という意味で 6m です。)
image.png
New-TimeSpan は、マイナスの期間も指定できるので、変数に180日"前"を入れてしまうやり方でも同じ結果が得られます。
image.png
スクリプトのソースを他の人が見たときに分かりやすいのは前者かな。
処理の流れや変数の使いかたに合わせて適宜使い分けられたらいいなと思います。

##書式を指定してみる
そうそう、出力フォーマットが年月日になっているので、これも何とかしたいですね。
get-date だと、-format オプションで簡単に好きなフォーマットで出せるのですが。
(これ、ログファイル名とか定義するときの定番の使い方ですね。)
image.png

New-TimeSpan -format yyyyMMdd とかやってもダメでした。
ので、少しググりまして。
ToString を使うのがよさそうです。

ここで、扱いやすくするために、上記の練習で出した6か月前の日時をいったん変数に格納します。
image.png
それをこうして こうじゃ
image.png
満足☆

いろいろなバリエーションを楽しんでみました。
image.png

##余談
バッチスクリプト時代は日付の数字を取り出ために、こういう定番の書き方ありましたね…
image.png
これをログファイル名などに使うときは、こんな感じで。
set LOGFILE=%LOGDIR%%COMMONNAME%%~n0%YYYYMMDD%.log

##追記:
@nukie_53 さんにコメント欄で教えていただいたことを取り入れつつあれこれ試してみると、Xか月前とかX日後といった値だけ使う場合は、
New-TimeSpan よりも DateTime オブジェクトを使いこなせるようになったほうが、やっぱり良さそう。

例えば、6か月前のファイルを削除するスクリプトはこんな感じで。

$date = Get-Date -format yyyyMMdd
$dir = "D:\Backup\Log\"
$log = "DeleteFile_$date.log"

"開始時間:" + (Get-Date -format G) | Out-File $dir$log -Encoding UTF8
$delitem = Get-ChildItem $dir -Recurse -include *.log | Where-Object {$_.LastWriteTime -lt (Get-Date).AddMonths(-6)}
$delitem | Out-File $dir$log -Encoding UTF8 -Append
if ( $delitem ) { Remove-Item -force $delitem } else { echo "対象ファイルはありません" | Out-File $dir$log -Encoding UTF8 -Append }
"終了時間:" + (Get-Date -format G) | Out-File $dir$log -Encoding UTF8 -Append

きっと New-TimeSpan には、もっと適した使い道があるはず。

##リファレンス

Microsoft Docs

New-TimeSpan
Where-Object コマンドレットの使用

######日付書式の指定方法を教わったサイト
Setup default date format like yyyy-mm-dd in Powershell?

Hey, Scripting Guy! シリーズの日付の扱いに関する記事いろいろ

Formatting Date Strings with PowerShell
Adding and Subtracting Dates with PowerShell
Working with Dates in PowerShell
Create Custom Date Formats with PowerShell
Hey, Scripting Guy! Weekend Scripter: The Scripting Wife Works with Dates in Windows PowerShell

0
2
4

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?