web-dev-qa-db-ja.com

単純なPowerShell LastWriteTime比較

ファイルのプロパティにアクセスしてLastWriteTimeプロパティを検出し、現在の日付と比較して日付の差を返すことができるPowerShellスクリプトが必要です。

私はこのようなものを持っています...

$writedate = Get-ItemProperty -Path $source -Name LastWriteTime

...しかし、LastWriteTimeを "DateTime"データ型にキャストできません。 「@ {LastWriteTime = ... date ...}」を「System.DateTime」に変換できません。

19
Steven Rogers

以下を試してください。

$d = [datetime](Get-ItemProperty -Path $source -Name LastWriteTime).lastwritetime

これはアイテムプロパティの奇妙さの一部です。 Get-ItemPropertyを実行すると、値は返されず、代わりにプロパティが返されます。値を取得するには、もう1レベルの間接参照を使用する必要があります。

26
JaredPar
(ls $source).LastWriteTime

( "ls"、 "dir"、または "gci"はGet-ChildItemの既定のエイリアスです。)

14
brianary

共有したい例があります

$File = "C:\Foo.txt"
#retrieves the Systems current Date and Time in a DateTime Format
$today = Get-Date
#subtracts 12 hours from the date to ensure the file has been written to recently
$today = $today.AddHours(-12)
#gets the last time the $file was written in a DateTime Format
$lastWriteTime = (Get-Item $File).LastWriteTime

#If $File doesn't exist we will loop indefinetely until it does exist.
# also loops until the $File that exists was written to in the last twelve hours
while((!(Test-Path $File)) -or ($lastWriteTime -lt $today))
{
    #if a file exists then the write time is wrong so update it
    if (Test-Path $File)
    {
        $lastWriteTime = (Get-Item $File).LastWriteTime
    }
    #Sleep for 5 minutes
    $time = Get-Date
    Write-Host "Sleep" $time
    Start-Sleep -s 300;
}
6
richbria90

OPが問題の解決として受け入れたため、ここでの回答のいずれにも誤りはありません。しかし、ある点で欠陥が見つかりました。代入の結果を変数に出力すると、求められている回答だけでなく、多数の空白行が含まれています。例:

PS C:\brh> [datetime](Get-ItemProperty -Path .\deploy.ps1 -Name LastWriteTime).LastWriteTime

Friday, December 12, 2014 2:33:09 PM



PS C:\brh> 

私は、簡潔さと正確さという2つのコードのファンです。 brianaryには簡潔さの権利があり、Roger Lipscombeへの帽子の先端がありますが、結果の余分な行のために両方とも正確性を失います。これが私がフィニッシュラインを超えた理由だからです。

PS C:\brh> (ls .\deploy.ps1).LastWriteTime.DateTime
Friday, December 12, 2014 2:33:09 PM

PS C:\brh> 

PowerShellがプロンプトを分離するために使用する行のみが追加されていることに注意してください。これで、これを比較のために変数に割り当てたり、私の場合のように、後のセッションで読み取りと比較のためにファイルに保存したりできます。

5
Jack Pines

(Get-Item $source).LastWriteTimeは、私が好む方法です。

4
Roger Lipscombe

少し簡単に-new-timespanコマンドレット。現在の時刻から時間間隔を作成します。

ls | where-object {(new-timespan $_.LastWriteTime).days -ge 1}

現在書き込まれていないすべてのファイルを表示します。

3
gbjbaanb

使用する

ls | %{(get-date)-$ _。LastWriteTime}

差分を取得するために機能します。 lsを単一のファイルに置き換えることができます。

2