2017-01-03 7 views
1

ファイルの最終書き込み時刻を使用してファイルをあるフォルダから別のフォルダに移動するpowershellスクリプトがあります。スクリプトは、lastwritetimeが指定された日付以下であるかどうかをチェックしています。今年の変更でこれはもはや正しく動作していないようです。私は12/29/2016、12/30/2016、および1/20/17の修正された日付のファイルを持っています。 12/29ファイルは、今日の1/13/2017以降に移動された唯一のファイルであってはならず、スクリプトはその日付から5日を引いたものを使用しています。したがって、それは12/29/2016以下のものだけを移動したはずです。しかし、2011年1月2日のファイルも移動されました。スクリプトは以下の通りですが、なぜこれが起こっているのかについてのアイディアです。Powershellスクリプトはlastwritetimeに基づいて間違ったファイルを移動しています

#Grab the day of the week it is TODAY 
$DayofWeek = (Get-Date).DayofWeek 

#Set the location we are going to be Pulling Files From 
$FromPath = "path i'm copying files from goes here" 

#Set the Location we are going to copy file To 
$ToPath = "path i'm copying files to" 

#Set a Default Value for DaysBack to Zero 
$DaysBack = 0 

#Set the Days Back if it is Tuesday through Friday 
switch ($DayofWeek) 
{ 
    "Tuesday" { $DaysBack = -5 } 
    "Wednesday" { $DaysBack = -5 } 
    "Thursday" { $DaysBack = -3 } 
    "Friday" { $DaysBack = -3 } 
    "Saturday" { $DaysBack = -3 } 

    #If today is not an above day then tell the user today no files should be moved 
    default  { Write-host "No files to move!" } 
} 

#if DaysBack does not equal ZERO then there are files that need to be moved! 
if($DaysBack -ne 0) { 
    Get-ChildItem -Path $FromPath | 
    Where-Object { $_.LastWriteTime.ToString("MMddyyyy") -le (Get-Date).AddDays($DaysBack).ToString("MMddyyyy") } | 
    Move-Item -Destination $ToPath 
} 
+3

'LastWriteTime'プロパティは' DateTime'オブジェクトで使用することができます。文字列に変換する必要はありません( '.toString()')。 –

+2

あなたのスクリプトを壊しているだけでなく、必要はありません。日付比較をテキスト比較に変更しています.MMddyyyyの最初の4文字は '1229'と' 1220'です。 – TessellatingHeckler

+0

これは、他のテキストベースのシェルで動作していたPowerShellを初めて使用する人にとって共通の概念上のハードルであるため、「不要」と言います。 'DateTime'オブジェクトを直接使うことができます。 –

答えて

0
$date1 = Get-Date -Year 2017 -Month 1 -Day 2 
$date2 = Get-Date -Year 2016 -Month 12 -Day 29 

$date1 -gt $date2 
#returns True 

$date1.ToString("MMddyyyy") -gt $date2.ToString("MMddyyyy") 
# "01022017" -gt "12292016" 
# returns False 

あなたは

if($DaysBack -ne 0) { 
    Get-ChildItem -Path $FromPath | 
    Where-Object { $_.LastWriteTime -le (Get-Date).AddDays($DaysBack) } | 
    Move-Item -Destination $ToPath 
} 

または

if($DaysBack -ne 0) { 
    Get-ChildItem -Path $FromPath | 
    Where-Object { $_.LastWriteTime.ToString("yyyyMMdd") -le (Get-Date).AddDays($DaysBack).ToString("yyyyMMdd") } | 
    Move-Item -Destination $ToPath 
} 
+0

ええ、そうです。私はlastwritetimeで日付を使う必要がある、私は時間が欲しくない。文字列に変換せずにこれを行う方法はありますか? – JM246

+0

私はちょっとあなたがこれを探していることを知っていた、私の2番目のスニペットはあなたの必要性をカバーする必要があります。日付を文字列( 'yyyyMMdd')として並べ替えるために書式を変更しました。 – sodawillow

関連する問題