2019年3月15日金曜日

PowerShellでファイルの更新日時を書き換えたい

普段は簡単に書き換えられないファイルの更新日時ですが、管理上の問題でどうしても書き換えたい時があったりします。

しかし、PowerShellを使うといともあっさり簡単に書き換える事が可能です。


■直接時間を指定して書き換えたい

仮にC:¥TEMP¥TEST_TEST.TXTというファイルがあったとします。



SET-ITEMPROPERTY C:\TEMP\TEST_TEST.TXT LASTWRITETIME "1999-12-31 23:59:59.997"

↑SET-ITEMPROPERTY ファイルパス LASTWRITETIME 反映したい日時

で行けます。

ポイントは、このPowerShellに限らずSQL-Serverとかもそうなんですが、"yyyy-MM-dd hh:mm:ss"という書式でもって文字列を書くと、処理系から日時として認識してもらえるという点です。


↑あっさりとファイルの更新日時が書き変わりました。


■本日の日時をセットしたい時


SET-ITEMPROPERTY C:\TEMP\TEST_TEST.TXT LASTWRITETIME (Get-Date -Format "yyyy-MM-dd hh:mm:ss")

↑本日の日時の時は、反映したい日時の所に「Get-Date -Format "yyyy-MM-dd hh:mm:ss"」と書くだけです。

ただ、-Formatオプションだと何か落ち着かいないという場合は、(Get-Date).ToString("yyyy-MM-dd hh:mm:ss")とも書けます。


↑ファイルの更新日時が、実行時の本日の日時に書き変わりました。


■先月の日時をセットするなど、日付に計算を施したい


SET-ITEMPROPERTY C:\TEMP\TEST_TEST.TXT LASTWRITETIME (Get-Date).AddMonths(-1).ToString("yyyy-MM-dd hh:mm:ss")

↑Get-Dateに計算を施す時は、(Get-Date).AddMonths(-1).ToString("yyyy-MM-dd hh:mm:ss") という風に、Get-Dateコマンドレットの各種日付計算メソッドで結果を計算してから、ToStringメソッドで日付用の書式を整えます。

Get-Dateコマンドレットは日付を扱う時の必殺技というくらい強力で、たとえば先月(-1ヵ月)の日時を求めたい時は(Get-Date).AddMonths(-1)だけでOK。


↑ファイルの更新日時が先月になりました。

ちなみに、Get-Dateにどんなメンバー(プロパティやメソッドなどをいっしょくたにメンバーと呼びます)があるのか?を知りたい時は以下のコマンドで分かります。



Get-Date | GET-MEMBER



   TypeName: System.DateTime

Name                 MemberType     Definition
----                 ----------     ----------
Add                  Method         datetime Add(timespan value)
AddDays              Method         datetime AddDays(double value)
AddHours             Method         datetime AddHours(double value)
AddMilliseconds      Method         datetime AddMilliseconds(double value)
AddMinutes           Method         datetime AddMinutes(double value)
AddMonths            Method         datetime AddMonths(int months)
AddSeconds           Method         datetime AddSeconds(double value)
AddTicks             Method         datetime AddTicks(long value)
AddYears             Method         datetime AddYears(int value)
CompareTo            Method         int CompareTo(System.Object value), int CompareTo(datetime value), int IComparab...
Equals               Method         bool Equals(System.Object value), bool Equals(datetime value), bool IEquatable[d...
GetDateTimeFormats   Method         string[] GetDateTimeFormats(), string[] GetDateTimeFormats(System.IFormatProvide...
GetHashCode          Method         int GetHashCode()
GetObjectData        Method         void ISerializable.GetObjectData(System.Runtime.Serialization.SerializationInfo ...
GetType              Method         type GetType()
GetTypeCode          Method         System.TypeCode GetTypeCode(), System.TypeCode IConvertible.GetTypeCode()
IsDaylightSavingTime Method         bool IsDaylightSavingTime()
Subtract             Method         timespan Subtract(datetime value), datetime Subtract(timespan value)
ToBinary             Method         long ToBinary()
ToBoolean            Method         bool IConvertible.ToBoolean(System.IFormatProvider provider)
ToByte               Method         byte IConvertible.ToByte(System.IFormatProvider provider)
ToChar               Method         char IConvertible.ToChar(System.IFormatProvider provider)
ToDateTime           Method         datetime IConvertible.ToDateTime(System.IFormatProvider provider)
ToDecimal            Method         decimal IConvertible.ToDecimal(System.IFormatProvider provider)
ToDouble             Method         double IConvertible.ToDouble(System.IFormatProvider provider)
ToFileTime           Method         long ToFileTime()
ToFileTimeUtc        Method         long ToFileTimeUtc()
ToInt16              Method         int16 IConvertible.ToInt16(System.IFormatProvider provider)
ToInt32              Method         int IConvertible.ToInt32(System.IFormatProvider provider)
ToInt64              Method         long IConvertible.ToInt64(System.IFormatProvider provider)
ToLocalTime          Method         datetime ToLocalTime()
ToLongDateString     Method         string ToLongDateString()
ToLongTimeString     Method         string ToLongTimeString()
ToOADate             Method         double ToOADate()
ToSByte              Method         sbyte IConvertible.ToSByte(System.IFormatProvider provider)
ToShortDateString    Method         string ToShortDateString()
ToShortTimeString    Method         string ToShortTimeString()
ToSingle             Method         float IConvertible.ToSingle(System.IFormatProvider provider)
ToString             Method         string ToString(), string ToString(string format), string ToString(System.IForma...
ToType               Method         System.Object IConvertible.ToType(type conversionType, System.IFormatProvider pr...
ToUInt16             Method         uint16 IConvertible.ToUInt16(System.IFormatProvider provider)
ToUInt32             Method         uint32 IConvertible.ToUInt32(System.IFormatProvider provider)
ToUInt64             Method         uint64 IConvertible.ToUInt64(System.IFormatProvider provider)
ToUniversalTime      Method         datetime ToUniversalTime()
DisplayHint          NoteProperty   DisplayHintType DisplayHint=DateTime
Date                 Property       datetime Date {get;}
Day                  Property       int Day {get;}
DayOfWeek            Property       System.DayOfWeek DayOfWeek {get;}
DayOfYear            Property       int DayOfYear {get;}
Hour                 Property       int Hour {get;}
Kind                 Property       System.DateTimeKind Kind {get;}
Millisecond          Property       int Millisecond {get;}
Minute               Property       int Minute {get;}
Month                Property       int Month {get;}
Second               Property       int Second {get;}
Ticks                Property       long Ticks {get;}
TimeOfDay            Property       timespan TimeOfDay {get;}
Year                 Property       int Year {get;}
DateTime             ScriptProperty System.Object DateTime {get=if ((& { Set-StrictMode -Version 1; $this.DisplayHin...


↑PowerShellは、プログラミングしたいなぁ・・・という時に、JavaScript級におすすめです。

というか、自分が学生時代にPowerShellとJavaScriptがこうやってバリバリ使える環境になっていたらなぁと、うらやましくて大変です。

漠然とやりたい事をひねり出さなくても、Windows(などのOS)と対話しながら、実際にこうやって作業をしながらコンピューターに親しめるのは本当に大きい。