2017-08-22 14 views
0

私は一定の日数の古いファイルを見つけるためのスクリプトを作成しました。私は30日のファイルを見つけるためにそれを使用していますが、私は時間の異なる量を接続する必要がある場合はそれを開いたままにしようとしています。30日前のファイルを見つける

スクリプトのこの部分に必要な情報を入力したら、条件を満たすすべてのファイルのテキストファイルを作成することになっています。 -lt-gtまたは-leまたは-geのファイルを見つけることができますが、-eqを使用すると結果は得られません。下にリストされたスクリプトの部分に何が間違っているかについての考えはありますか?

$Path = Read-Host "What path should I look at?" 
$DaysOld = Read-Host "How many days old should the files I'm looking for be?" 
$Currentdate = Get-Date 
$Targetdate = $Currentdate.AddDays(-$DaysOld).ToString('MM-dd-yyyy') 
Write-Host "The target date is $targetdate" 
$SourceFolder = $Path 
$files = Get-ChildItem $Path -Recurse | 
     Where-Object { $_.LastWriteTime -eq $Targetdate } | 
     Where-Object { $_.PSIsContainer -eq $false } | 
     ForEach-Object { $_.FullName } | 
     Out-File $outfileCopy 
+1

'-eq'演算子を使用すると正確な日付と時刻が2番目に一致します。結果は返されません。 – cet51

答えて

5

-eqを使用に伴う問題は、DateTimeオブジェクトがそれほど00:00に2017年8月22日の11時59分27秒AMの-eqで2017年8月22日であり、ダウン第二にあることです。 00午前?いいえ、そうではありません。それを打破するためにできることは、.ToShortDateString()メソッドを使用して、2014年8月22日などの文字列を出力する方法です。

$Path = Read-Host "What path should I look at?" 
$DaysOld = read-host "How many days old should the files I'm looking for be?" 
$Currentdate = get-date 
$Targetdate = $currentdate.AddDays(-$daysOLD).ToShortDateString() 
Write-Host "The target date is $targetdate" 
$SourceFolder = $path 
$files = Get-ChildItem $path -Recurse| Where-Object {$_.lastwritetime.ToShortDateString() -eq $targetdate}|Where-Object {$_.PSIsContainer -eq $false} | ForEach-Object {$_.fullname}| out-file $outfileCopy 

このアプローチは、同じ日からのものと一致するようにしようとしたときにのみ、一日の時間を無視して、使用すべきである、と未満のものを探しているときに使用すべきではない、または-le含む(以上日付評価の代わりに文字列評価を使用するため)。

編集:私は何年も間違っていて、知らなかった。オブジェクトタイプを保持する[DateTime]オブジェクトの.dateプロパティを指摘するために@Mattに感謝しますが、オブジェクトの時間的側面はゼロになっています。より良い答え:.Dateプロパティを使用して比較します。これは評価よりも大きくても小さくても機能します。

$Path = Read-Host "What path should I look at?" 
$DaysOld = read-host "How many days old should the files I'm looking for be?" 
$Currentdate = get-date 
$Targetdate = $currentdate.AddDays(-$daysOLD).Date 
Write-Host "The target date is $targetdate" 
$SourceFolder = $path 
$files = Get-ChildItem $path -Recurse| Where-Object {$_.lastwritetime.Date -eq $targetdate}|Where-Object {$_.PSIsContainer -eq $false} | ForEach-Object {$_.fullname}| out-file $outfileCopy 
+4

私はいつもこのようなもののために '().Date'を使います。 datetimeオブジェクトは保持しますが、時間はゼロにします。 – Matt

+0

私は知らなかった、私は現在私の答えを更新します。マットありがとう! – TheMadTechnician

+0

私はそれがファイルとの関係で実際の時間帯と関係があると考えました。私はパワーシェルの新人ですから、どうやってそれを回避するのか分かりませんでした。私はこれらの答えをほんの数分で取り入れようとします。どうもありがとうございます! – Ochuse

関連する問題