2016-06-24 15 views
1

次のような規則で命名されたフォルダのディレクトリをPowerShellでスキャンします。yyyymmdd。ディレクトリをスキャンし、現在および最大1週間前のすべてのフォルダを見つけて、別のディレクトリにコピーします。それを他のディレクトリにコピーした後、新しいディレクトリのフォルダを同じ方法で削除し、18か月以上経過していないフォルダを削除したいと思います。これを行う簡単な方法がありますか?私は以下のスクリプトを貼り付けました。PowerShellスクリプトを使用してファイルを削除する

$targetDirectoryは、あなたは自分のスクリプトの末尾に以下を追加、(18ヶ月よりも古いもの)を削除したいファイルが含まれていると仮定すると、
$targetdirectory = "\\DPR320-W12-1600\PRTG" 
$sourcedirectory = "C:\Users\Public\Documents\PRTG Traffic Grapher" 
$todaysdate=get-date 
$minusoneweek=$todaysdate.adddays(-7) 
$minusdate=($minusoneweek.Month).tostring(),($minusoneweek.day).tostring(),($minusoneweek.year).tostring() 
$todaysdatestring=($todaysdate.Month).tostring(),($todaysdate.day).tostring(),($todaysdate.year).tostring() 
$oldfilename=$minusdate[0]+$minusdate[1]+$minusdate[2]+" backup" 
$newfilename=$todaysdatestring[0]+$todaysdatestring[1]+$todaysdatestring[2]+" backup" 


Get-ChildItem $sourcedirectory\config | Where-Object { 
    $_.PsIsContainer -and 
    $_.BaseName -match '\d{6}' -and 
    ([DateTime]::ParseExact($_.BaseName, 'yyyyMMdd', $null) -gt (Get-Date).AddDays(-7)) 
} |Copy-Item -Recurse -Force -Destination $targetdirectory\$oldfilename\config 

Copy-Item -Force $sourcedirectory\config.csv -Destination $targetdirectory\$oldfilename 
Copy-Item -Force $sourcedirectory\config.prtg -Destination $targetdirectory\$oldfilename 

rename-item $targetdirectory\$oldfilename $newfilename 

答えて

0

FoxDeployとの議論に基づいて: これは$ YourDirectoryをループし、名前が18か月以上経過した日付を表すかどうかを確認します。 名前をドット付きの形式にしていることを除いて、これを自分のクリーンアップに使用しました。

$CleanupList = Get-ChildItem $YourDirectory 
$Threshold = (get-date).AddMonths(-18) 

foreach ($DirName in $CleanupList) 
{ 
    If (([datetime]::ParseExact($DirName.BaseName,'yyyyMMdd',$null)) -lt $Threshold) 
    { 
     Remove-Item $DirName.FullName -Force -Recurse 
    } 
} 
+0

必ずしもその名前の規則に従わないフォルダがあります。スクリプトがそれらを無視するようにするにはどうしたらよいのですか? –

+0

アイデアを示すためにいくつかの例を挙げることができます。これまでは、ParseExactが実際にフォルダ名から日付をフェッチできるかどうかをチェックすることしか考えられませんでした。 –

0

:最初の実行が-WhatIfが表示されます

#resolve this day, 18 months ago 
$18Months = (get-date).AddMonths(-18) 

#get the name in the right format (i.e. 20141224) 
$18MonthString = get-date -Date $18Months -UFormat "%Y%m%d" 

#find the files with a name like this and delete them 
$OldPrtgFiles = dir $targetDirectory | Where Name -like "$18MonthString*" 
$OldPrtgFiles | remove-item -whatif 

をどのファイルが削除されるかを表示します。これに満足している場合は、WhatIfを削除してください。

+0

ありがとうございました!しかし、古いデータであるファイルが最近、ディレクトリにコピーされたばかりなので、書込み時間は18ヶ月前にはなりませんでした。フォルダ名を使用して削除するファイルをどのように指定することができますか?命名形式は、データが取得される日付です(例:20140624).2014年6月24日に取得されたデータのフォルダ名になります。 –

+0

ああ、そうだ。だから私たちは20141224(18か月前)のような名前のファイルを削除したいと思うでしょう – FoxDeploy

+0

今、私の答えを確認してください。 – FoxDeploy

関連する問題