New-TimeSpan コマンド

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

##とりあえず、基本
[New-TimeSpan -- docs.microsoft.com](https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.utility/new-timespan?view=powershell-6)


ここに、素敵な使用例が書いてあったのです。
<a href="https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.utility/new-timespan?view=powershell-6#examples">![image.png](https://qiita-image-store.s3.amazonaws.com/0/228634/f6979e36-981d-b8d7-ac61-5fde11bf6c2b.png)</a>

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


##では試してみましょう
確認環境は Windows Server 2008 R2 の PowerShell Ver.2.0 です。
以下、2018/11/26 時点でのコマンド実行結果です。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/228634/bccb913e-4c1e-4f37-5e52-40c99bf38c96.png)

まずは初心者らしく使用例に忠実に。
あっ ロケールのデフォルトのフォーマットですね。
分かりやすいけど使いにくいという（笑）
![image.png](https://qiita-image-store.s3.amazonaws.com/0/228634/e04a6f6a-be34-4f8e-1404-375192d3c197.png)

では、少しバリエーションを変えて練習です。6か月前とか出したいですね。
指定できるオプションで一番大きい時間の単位は、Days なので（Months とかあるといいのにね）、おおよそ6か月として -days 180 を指定します。（変数名は 6 Months という意味で 6m です。）
![image.png](https://qiita-image-store.s3.amazonaws.com/0/228634/7a387160-b5e4-a72b-fa59-559ba8b6e017.png)
`New-TimeSpan` は、マイナスの期間も指定できるので、変数に180日"前"を入れてしまうやり方でも同じ結果が得られます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/228634/7a354193-6e4a-52c5-f330-d7429542d47f.png)
スクリプトのソースを他の人が見たときに分かりやすいのは前者かな。
処理の流れや変数の使いかたに合わせて適宜使い分けられたらいいなと思います。


##書式を指定してみる
そうそう、出力フォーマットが年月日になっているので、これも何とかしたいですね。
get-date だと、-format オプションで簡単に好きなフォーマットで出せるのですが。
（これ、ログファイル名とか定義するときの定番の使い方ですね。）
![image.png](https://qiita-image-store.s3.amazonaws.com/0/228634/83e0ccc1-0f68-6557-fd7b-0d0390527a43.png)

New-TimeSpan -format yyyyMMdd とかやってもダメでした。
ので、少し<a href="https://stackoverflow.com/questions/22826185/setup-default-date-format-like-yyyy-mm-dd-in-powershell">ググり</a>まして。
ToString を使うのがよさそうです。

ここで、扱いやすくするために、上記の練習で出した6か月前の日時をいったん変数に格納します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/228634/a937036f-f5d4-f137-ffc8-ef0a11cfe9d6.png)
それをこうして こうじゃ
![image.png](https://qiita-image-store.s3.amazonaws.com/0/228634/a3681c8c-cf69-1133-68e4-783b33b79701.png)
満足☆

いろいろなバリエーションを楽しんでみました。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/228634/194cfc9d-53c3-ddb2-1cca-151d5594b55f.png)



##余談
バッチスクリプト時代は日付の数字を取り出ために、こういう定番の書き方ありましたね…
![image.png](https://qiita-image-store.s3.amazonaws.com/0/228634/b445d79c-e690-ccf6-15f6-2a163545d5ce.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](https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.utility/new-timespan?view=powershell-6)
[Where-Object コマンドレットの使用]("https://docs.microsoft.com/ja-JP/previous-versions//ee177028(v=technet.10)")


######日付書式の指定方法を教わったサイト
[Setup default date format like yyyy-mm-dd in Powershell?](https://stackoverflow.com/questions/22826185/setup-default-date-format-like-yyyy-mm-dd-in-powershell)


###### Hey, Scripting Guy! シリーズの日付の扱いに関する記事いろいろ
[Formatting Date Strings with PowerShell](https://blogs.technet.microsoft.com/heyscriptingguy/2015/01/22/formatting-date-strings-with-powershell/)
[Adding and Subtracting Dates with PowerShell](https://blogs.technet.microsoft.com/heyscriptingguy/2015/01/21/adding-and-subtracting-dates-with-powershell/)
[Working with Dates in PowerShell](https://blogs.technet.microsoft.com/heyscriptingguy/2015/01/19/working-with-dates-in-powershell/)
[Create Custom Date Formats with PowerShell](https://blogs.technet.microsoft.com/heyscriptingguy/2015/01/23/create-custom-date-formats-with-powershell/)
[Hey, Scripting Guy! Weekend Scripter: The Scripting Wife Works with Dates in Windows PowerShell](https://blogs.technet.microsoft.com/heyscriptingguy/2010/04/10/hey-scripting-guy-weekend-scripter-the-scripting-wife-works-with-dates-in-windows-powershell/)